※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts