본문 바로가기
공부 정리/백준

[백준] 자바 8979 올림픽

by 경적필패. 2021. 9. 17.
반응형

문제

올림픽은 참가에 의의가 있기에 공식적으로는 국가 간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘하는지에 관심이 많기 때문에 비공식적으로는 국가 간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.

  1. 금메달 수가 더 많은 나라 
  2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
  3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라 

각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다. 

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오. 

입력

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.

출력

출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다. 


테스트 케이스

 

입력 1

3 1
1 1 0 0
3 2 0 0
2 2 0 0

출력 1

3

 

입력 2

4 3
1 1 2 0
2 0 1 0
3 0 1 0
4 0 0 1

출력 2

2

 

입력 3

4 2
1 3 0 0
3 0 0 2
4 0 2 0
2 0 2 0

출력 3

2

 


접근

1.숫자 2개를 공백을 넣어서 입력받습니다.

 

1-1. 첫 숫자는 국가의 수, 두 번째 숫자는 순위를 알고 싶은 국가의 번호.

 

2. 국가의 수만큼 국가 번호, 금메달 수, 은메달 수, 동메달 수 이렇게 총 4 갯값을 입력받습니다.

(ex 1 1 1 1)(1번 국가, 금메달 1개, 은메달 1개, 동메달 1개)

 

3.두번째 숫자에 해당하는 국가가 국가들 중 몇 위인지 출력해줍니다.(금메달 제일 많은 나라가 1등, 금메달 같으면 은메달 많은 나라가 우위, 은메달 수 같으면 동메달 수로 우위 결정)

 

 

저는 이 문제를 풀때, 모든 나라의 순위를 매기려다가 좀 헤매었습니다.

그렇게 하지 말고, 순위를 알고 싶은 나라를 기준으로 정하고 그것보다 금메달 많은 나라가 있으면 rank를 +1 하는 식으로,

기준 나라와 금메달이 같다면 은메달 수를 비교하며,

은메달 수가 같으면 동메달 수를 비교하여 rank값을 조정합니다.

 

이렇게 문제를 푸니 해결되었습니다.


코드

import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;

public class Main {

	/*
 	 8979 problem
	*/
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int num = Integer.parseInt(st.nextToken());
		int cer = Integer.parseInt(st.nextToken());
		int arr[][] = new int[num+1][4];
		int rank = 1;
		for(int i=1; i<=num; i++) {
			st = new StringTokenizer(br.readLine());
			int index = Integer.parseInt(st.nextToken());
			int g = Integer.parseInt(st.nextToken());
			int s = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			arr[index][0] = g;
			arr[index][1] = s;
			arr[index][2] = b;
		}
		
		for(int i=1; i<=num; i++) {
			if(arr[i][0] > arr[cer][0]) {
				rank++;
			}
			else if(arr[i][0] == arr[cer][0] && arr[i][1] > arr[cer][1]) {
				rank++;
			}
			else if(arr[i][0] == arr[cer][0] && arr[i][1] == arr[cer][1] && arr[i][2] > arr[cer][2]) {
				rank++;
			}
		}
		bw.write(String.valueOf(rank));
		bw.flush();
		br.close();
		bw.close();
	}
}

주의

 

 

반응형

댓글