[백준] 2535번 : 아시아 정보올림피아드_java

응갱·2022년 11월 11일
0

백준

목록 보기
28/56
post-thumbnail

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

📎문제

최근 아시아 지역의 학생들만 참여하는 정보 올림피아드 대회가 만들어졌다. 이 대회는 온라인으로 치러지기 때문에 각 나라에서 이 대회에 참여하는 학생 수의 제한은 없다.

참여한 학생들의 성적순서대로 세 명에게만 금, 은, 동메달을 수여한다. 단, 동점자는 없다고 가정한다. 그리고 나라별 메달 수는 최대 두 개다.

예를 들어, 대회 결과가 다음의 표와 같이 주어졌다고 하자.

이 경우, 금메달 수상자는 1번 국가의 1번 학생이고, 은메달 수상자는 1번 국가의 2번 학생이며, 동메달 수상자는 3번 국가의 4번 학생이다. (1번 국가의 3번 학생의 성적이 동메달 수여자보다 높지만, 나라 별 메달 수가 두 개 이하 이므로 1번 국가 3번 학생은 동메달을 받을 수 없다.)

대회 결과가 입력으로 주어질 때, 메달 수상자를 결정하여 출력하는 프로그램을 작성하시오.

📎입력

첫 번째 줄에는 대회참가 학생 수를 나타내는 N이 주어진다. 단, 3 ≤ N ≤ 100이다. 두 번째 줄부터 N개의 줄에는 각 줄마다 한 학생의 소속 국가 번호, 학생 번호, 그리고 성적이 하나의 빈칸을 사이에 두고 주어진다. 단, 국가 번호는 1부터 순서대로 하나의 정수로 주어지며, 각 학생번호는 각 나라별로 1부터 순서대로 하나의 정수로 주어진다, 점수는 0 이상 1000 이하의 정수이고, 동점자는 없다고 가정한다. 입력으로 제공되는 국가는 적어도 두 나라 이상이다.

📎출력

메달을 받는 학생들을 금, 은, 동메달 순서대로 한 줄에 한 명씩 출력한다. 즉, 첫 번째 줄에는 금메달 수상자를, 두 번째 줄에는 은메달 수상자를, 세 번째 줄에는 동메달 수상자를 출력한다. 하나의 줄에는 소속국가 번호와 학생 번호를 하나의 빈칸을 사이에 두고 출력한다.

📎코드

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

public class pr2535 {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int n = Integer.parseInt(bf.readLine());
		int[][] arr = new int[n][3];

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(bf.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
			arr[i][2] = Integer.parseInt(st.nextToken());
		}

		Arrays.sort(arr, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o2[2] - o1[2];
			}
		});

		//나라 별 메달 수 제한
		int last = 2;
		if (arr[0][0] == arr[1][0]) {
			for (int i = 2; i < n; i++) {
				if (arr[0][0] != arr[i][0]) {
					last = i;
					break;
				}
			}
		}
		System.out.println(arr[0][0] + " " + arr[0][1]);
		System.out.println(arr[1][0] + " " + arr[1][1]);
		System.out.println(arr[last][0] + " " + arr[last][1]);

	}

}

📎코드 해석

  • 2차원 배열 arr을 생성해 입력받는 국가번호, 학생번호, 점수를 각각 배열의 1열, 2열, 3열에 저장한다.
  • Comparator 를 이용해 점수를 기준으로 내림차순 정렬한다.
  • 배열에 내림차순 정렬 되었기 때문에 0행부터 순서대로 출력한다.
  • 이때, 나라 별 메달 수가 2개 이하로 제한되어 있다. 금메달과 은메달을 같은 국가에서 받는 경우에만 이 조건에 걸리기 때문에 if문을 이용해 동메달을 받을 학생을 정한다.

✏️ Comparator

Comparator 는 다차원 배열, 객체 등의 정렬에 유용하고, 사용자가 임의로 정렬을 정의할 수 있어 편리하다.

참고
https://code0xff.tistory.com/18
https://yuja-kong.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A0%95%EB%A0%AC-Comparable-Comparator

🥔후기

출력 예시에 속으면 안 된다. 무조건 4번째 학생이 상을 받을 거라 착각했는데 아니었다. ㄱ-
Comparator 배우고 잊고 살던 감자의 최후 , , ,

profile
🥔 한 덩이

0개의 댓글