[백준] 나는 학급회장이다(C++)

comomo·2024년 4월 3일

코딩연습

목록 보기
8/28

문제

나는 학급회장이다

문제설명

N명의 학생들이 모인 초등학교 반에서 학급회장 선거를 하려고 한다. 그 중 3명이 회장후보로 나왔고, 이들에 대한 선호도를 N명의 학생들 각각에게 적어내도록 하였다. 세 명의 후보는 후보 1번, 후보 2번, 후보 3번이라 한다.
모든 학생은 3명의 후보 중에서 가장 선호하는 후보에게는 3점, 두 번째로 선호하는 후보에게는 2점, 가장 선호하지 않는 후보에게는 1점을 주어야 한다. 3명의 후보에 대한 한 학생의 선호 점수는 모두 다르며, 1점, 2점, 3점이 정확히 한 번씩 나타나야 한다.
후보의 최종 점수는 학생들로부터 받은 자신의 선호도 점수를 모두 더한 값이 된다. 그러면 3명의 후보 중 가장 큰 점수를 받은 후보가 회장으로 결정된다. 단, 점수가 가장 큰 후보가 여러 명인 경우에는 3점을 더 많이 받은 후보를 회장으로 결정하고, 3점을 받은 횟수가 같은 경우에는 2점을 더 많이 받은 후보를 회장으로 결정한다. 그러나 3점과 2점을 받은 횟수가 모두 동일하면, 1점을 받은 횟수도 같을 수밖에 없어 회장을 결정하지 못하게 된다.
여러분은 선호도 투표를 통해 얻은 세 후보의 점수를 계산한 후, 유일하게 회장이 결정되는 경우에는 회장으로 결정된 후보의 번호(1, 2, 3 중 한 번호)와 최고 점수를 출력하고, 회장을 결정하지 못하는 경우에는 번호 0과 최고 점수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 반의 학생들의 수 N (3 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지는 데, 첫 번째 점수는 후보 1번에 대한 점수이고 두 번째 점수는 후보 2번에 대한 점수이고 세 번째 점수는 후보 3번에 대한 점수이다. 이 세 점수는 서로 다르며, 1, 2, 3이 정확히 한 번씩 나타난다.

출력

학생들의 선호도 투표 결과로부터, 회장이 유일하게 결정되는 경우에는 회장으로 결정된 후보의 번호와 최고 점수를 출력하고, 유일하게 결정할 수 없는 경우에는 0과 최고 점수를 출력한다.

해결방법

우선 3x3배열을 만들고 후보자의 총 점수, 받은 2점의 수 ,받은 3점의 수 순서대로 저장한다.
최고점수를 구하고 최고 점수를 받은 후보를 찾아 벡터에 삽입하고 벡터의 크기가 1이면 후보자와 최고점을 출력하고 벡터의 크기가 1보다 크면 3점의 개수, 2점의 개수에 대해 동일한 과정을 반복하도록 했다.

코드

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

int main() {
	int arr[3][3] = {}; //점수, 2점 수, 3점 수

	int n,score;
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < 3; j++) {
			cin >> score;
			arr[j][0] += score;
			if (score >= 2) arr[j][score - 1]++;
		}
	}

	int max_score = arr[0][0] > arr[1][0] ? arr[0][0] : arr[1][0] > arr[2][0] ? arr[1][0] : arr[2][0];
	vector<int> hubo;
	int king = 0, max = 0, size;
	for (int i = 0; i < 3; i++) {
		if (max_score == arr[i][0]) hubo.push_back(i);
	}
	if (hubo.size() == 1) king = hubo[0] + 1; 
	else { //점수 동일
		int x = hubo[0];		
		size = hubo.size();
		max = arr[x][2];
		hubo.push_back(x);
		for(int i=1;i<size;i++){
			if (arr[hubo[i]][2] > max) {
				hubo.erase(hubo.begin() + size, hubo.end());
				hubo.push_back(hubo[i]);
				max = arr[hubo[i]][2];
			}
			else if (arr[i][2] == max) hubo.push_back(i);
		}
		hubo.erase(hubo.begin(), hubo.begin() + size);
		if (hubo.size() == 1) king = hubo[0] + 1;
		else { //점수 동일
			int x = hubo[0];
			size = hubo.size();
			max = arr[x][1];
			hubo.push_back(x);
			for (int i = 1; i < size; i++) {
				if (arr[hubo[i]][1] > max) {
					hubo.erase(hubo.begin() + size, hubo.end());
					hubo.push_back(hubo[i]);
					max = arr[hubo[i]][1];
				}
				else if (arr[i][1] == max) hubo.push_back(i);
			}
			hubo.erase(hubo.begin(), hubo.begin() + size);
			if (hubo.size() == 1) king = hubo[0] + 1;

		}

	}
	cout << king << ' ' << max_score;
}


성공은 했지만 코드를 너무 복잡하게 작성해서 좋은 방법은 아닌것 같다

profile
안녕하세요!

0개의 댓글