suheang

[백준] | JAVA, 자바 | 1292번 - 쉽게 푸는 문제 본문

알고리즘

[백준] | JAVA, 자바 | 1292번 - 쉽게 푸는 문제

suheang 2024. 4. 1. 20:55

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

 

2456번: 나는 학급회장이다

첫째 줄에는 반의 학생들의 수 N (3 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지는 데, 첫 번째 점수는 후보 1번에 대한 점수이고 두

www.acmicpc.net


문제 요약 :

N명의 학생들이 모인 초등학교 반에서 학급회장 선거를 하려고 한다. 그 중 3명이 회장후보로 나왔고, 이들에 대한 선호도를 N명의 학생들 각각에게 적어내도록 하였다. 세 명의 후보는 후보 1번, 후보 2번, 후보 3번이라 한다.

모든 학생은 3명의 후보 중에서 가장 선호하는 후보에게는 3점, 두 번째로 선호하는 후보에게는 2점, 가장 선호하지 않는 후보에게는 1점을 주어야 한다. 3명의 후보에 대한 한 학생의 선호 점수는 모두 다르며, 1점, 2점, 3점이 정확히 한 번씩 나타나야 한다.

후보의 최종 점수는 학생들로부터 받은 자신의 선호도 점수를 모두 더한 값이 된다. 그러면 3명의 후보 중 가장 큰 점수를 받은 후보가 회장으로 결정된다.

단, 점수가 가장 큰 후보가 여러 명인 경우에는 3점을 더 많이 받은 후보를 회장으로 결정하고, 3점을 받은 횟수가 같은 경우에는 2점을 더 많이 받은 후보를 회장으로 결정한다. 그러나 3점과 2점을 받은 횟수가 모두 동일하면, 1점을 받은 횟수도 같을 수밖에 없어 회장을 결정하지 못하게 된다.

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


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[][] scores = new int[n][3];
        int[][] candidates = new int[3][3];

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 3; j++) {
                scores[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 3; j++) {
                if (scores[i][j] == 3) {
                    candidates[j][2]++;
                } else if (scores[i][j] == 2) {
                    candidates[j][1]++;
                } else {
                    candidates[j][0]++;
                }
            }
        }

        int sum = 0;
        int max = 0;
        int chairman = 0;
        int temp = 0;

        for (int i = 0; i < 3; i++) {
            sum = (candidates[i][0]) + (candidates[i][1] * 2) + (candidates[i][2] * 3);
            if (sum > max) {
                chairman = i;
                max = sum;
                temp = 0;
            } else if (sum == max) {
                if (candidates[i][2] > candidates[chairman][2]) {
                    chairman = i;
                    temp = 0;
                } else if (candidates[i][2] == candidates[chairman][2]) {
                    if (candidates[i][1] > candidates[chairman][1]) {
                        chairman = i;
                        temp = 0;
                    } else if (candidates[i][1] == candidates[chairman][1]) {
                        temp = -1;
                    }
                }
            }
        }

        if (temp == -1) {
            System.out.println("0 " + max);
        } else {
            System.out.println((chairman + 1) + " " + max);
        }
    }
}

 

1. 학생 수 n 입력받기

2. 학생들이 작성한 선호도 점수와 후보들의 선호도 점수를 저장할 배열 socres, candidates 생성

3. 학생 수 n만큼 선호도 점수 입력받기

4. 입력받은 선호도 점수를 1, 2, 3점 구분해서 저장

5. 선호도 점수 합을 계산하기 위해 변수 sum, 가장 높은 점수를 확인하기 위해 변수 max, 당선된 후보 번호를 저장할 변수 chairman, 중복을 비교할 변수 temp 생성

6. 가장 높은 점수를 저장한 max와 선호도 점수 합 sum을 비교해 sum이 max보다 크다면 max를 sum으로 변경하고 후보 번호를 변경, temp도 0으로 초기화

7. 만약 max와 sum이 같다면 3점을 저장해둔 candidates[][2] 배열을 비교, 3점을 더 많이 획득한 사람이 있다면 후보로 저장, temp 0으로 초기화

8. 3점이 같다면 candidates[][1] 배열로 2점을 비교, 2점이 더 많이 획득한 사람이 있다면 후보로 저장, temp 0으로 초기화

9. 만약 2점 역시 같다면 temp를 -1로 저장

10. temp가 -1일 경우 0을 출력하고 최대점수 출력, 그 외의 경우 당선된 후보 번호와 최대점수를 출력

 

temp를 계속 0으로 초기화 하는 이유는 예제에 1, 2, 3번 후보 모두 최고 점수가 같고 3점을 받은 횟수가 같을 때,

1, 2번 후보가 2점을 받은 횟수가 같아 temp를 -1로 저장하고 3번 후보와 비교할 때 3번 후보가 2점을 받은 횟수가 많다면 -1이 저장 된 변수 temp를 0으로 초기화 해야 하기 때문이다.