※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 11637번 문제인 인기 투표이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/11637
11637번: 인기 투표
각 테스트 케이스는 첫 번째 줄부터 순서대로 출력된다. 최다 득표자가 과반수 득표를 했을경우에는 "majority winner R", 절반 이하의 득표를 하였을 경우엔 "minority winner R"가 되며, 최다 득표자가 없
www.acmicpc.net
주어진 투표의 결과를 보고 (1) 가장 많은 표수를 받은 후보의 그 표수와 그러한 표수를 받은 후보의 수를 구하고 (2) 그런 후보의 수가 1명이라면 그가 받은 표수가 과반수인지를 판단해 문제를 해결할 수 있다.
각 후보가 받은 표들을 차례대로 읽을 때마다 기존 최대표수보다 더 많은 표를 받은 의원이 나타나면 그 후보의 번호와 표수를 갱신하고(이 때 이 표수는 절대 중복이 아님을 확인하자), 기존 최대표수와 같은 표를 받은 의원이 나타나면 현재 최대 표수가 중복임을 저장하자. 또한 전체 표수를 세는 변수를 만들어 이 과정을 진행하며 그 값을 함께 계산하자.
위와 같은 과정을 거쳐 구한 최대 표수, 그 표수를 받은 의원의 번호, 그 표수의 중복값 여부 및 전체 표수를 이용해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int T, N;
int mx, idx, total;
bool dup = 0;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while (T--) {
mx = -1, idx = -1, total = 0;
cin >> N;
for (int i = 1; i <= N; i++) {
int x; cin >> x;
total += x;
if (x > mx) mx = x, idx = i, dup = 0;
else if (x == mx) dup = 1;
}
if (dup) cout << "no winner\n";
else if (mx * 2 > total) cout << "majority winner " << idx << '\n';
else cout << "minority winner " << idx << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1326 // C++] 폴짝폴짝 (0) | 2023.02.22 |
---|---|
[BOJ 2531 // C++] 회전 초밥 (0) | 2023.02.22 |
[BOJ 9693 // C++] 시파르 (0) | 2023.02.21 |
[BOJ 6550 // C++] 부분 문자열 (0) | 2023.02.21 |
[BOJ 5698 // C++] Tautogram (0) | 2023.02.21 |