본문 바로가기

PS_Baekjoon

[백준 C++] 1417번 : 국회의원 선거

https://www.acmicpc.net/problem/1417

 

1417번: 국회의원 선거

첫째 줄에 후보의 수 N이 주어진다. 둘째 줄부터 차례대로 기호 1번을 찍으려고 하는 사람의 수, 기호 2번을 찍으려고 하는 수, 이렇게 총 N개의 줄에 걸쳐 입력이 들어온다. N은 50보다 작거나 같

www.acmicpc.net

풀이 :

- 다솜이보다 큰 후보의 표를 하나씩 가져와서 다솜이의 표에 더해서 다솜이의 표가 최댓값이 되어야 한다.

- 이렇게 다솜이의 표를 최댓값으로 만들기 위한 최솟값을 구해야 한다. 

- 같은 표를 가진 후보가 여러명 있을 수도 있고, 최댓값이 여러개일 경우, 한 후보의 표만 빼서는 최솟값을 구할 수 없다.

- n이 100밖에 안되기 때문에 배열의 인덱스를 표 값으로 생각하고, 배열을 계속 탐색하며 매번 배열의 최댓값을 구했다.

- 다솜이의 표보다 큰 최댓값이 나오지 않을 때까지 최댓값을 구하고, 구한 최댓값과 다솜이의 표를 조절하여 정답을 구할 수 있었다.

 

코드 :

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    int n, num, cnt, arr[105] = {0, }, flag, max_index;
    
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> num;
        if(i == 0){
            flag = num; //다솜이의 표는 배열에 넣지 않고 따로 저장
        }else{
            arr[num]++; //각 인덱스는 표. 즉, 표의 갯수 저장
        }
    }
    cnt = 0;
    while(1){ //일단 무한 루프
        max_index = 0; //최대값을 찾기 위해 루프 돌 때마다 초기화
        for(int i=1; i<101; i++){ //배열 전체 탐색
            if(arr[i] > 0 && i >= flag){ //다솜이보다 큰 표 수 중 최댓값의 인덱스를 구한다
                max_index = i;
            }
        } 
        if(max_index > 0){ //최댓값이 존재한다면, 다솜이가 표를 하나 매수하기 때문에,
            arr[max_index]--; //최댓값의 인덱스의 수는 하나 빼고,
            arr[max_index-1]++; //최댓값인덱스의 이전 인덱스에 하나 더해준다
            flag++; //다솜이의 표를 하나 올려주고,
            cnt++; //카운트도 올려준다
        }else{ //최댓값이 존재하지 않는다면, 이미 다솜이가 최댓값이므로 break;
            break;
        }
    }
    cout << cnt << '\n';
}

  

'PS_Baekjoon' 카테고리의 다른 글

[백준 C++] 2161번 : 카드1  (1) 2023.03.16
[백준 C++] 11728번 : 배열 합치기  (0) 2023.03.15
[백준 C++] 2581번 : 소수  (0) 2023.03.13
[백준 C++] 4949번 : 균형잡힌 세상  (0) 2023.03.12
[백준 C++] 2563번 : 색종이  (0) 2023.03.11