알고리즘/백준

8979번 : 올림픽

코딍코딍 2022. 9. 18. 00:13

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

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각

www.acmicpc.net

 

 

문제

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int arr[][] = new int[n][4];
        int g=0,s=0,m=0;
        for(int i=0;i<n;i++) {
            st = new StringTokenizer(br.readLine(), " ");
            arr[i][0] = Integer.parseInt(st.nextToken()); //국가번호
            arr[i][1] = Integer.parseInt(st.nextToken()); //금
            arr[i][2] = Integer.parseInt(st.nextToken()); //은
            arr[i][3] = Integer.parseInt(st.nextToken()); //동
            if(arr[i][0] == k) {
                g = arr[i][1];
                s = arr[i][2];
                m = arr[i][3];
            }
        }

        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[1]<o2[1]) return 1;
                else if (o1[1] == o2[1]) { //금메달 수 동일
                    if(o1[2]<o2[2]) return 1;
                    else if(o1[2] == o2[2]) { //은메달 수 동일
                        if(o1[3]<o2[3]) return 1;
                        else if (o1[3] == o2[3]) return 0; //동메달 수 동일
                        else return -1;
                    }
                    else return -1;
                }
                else return -1;
            }
        });

        for(int i=0;i<n;i++) {
            if (arr[i][1] == g && arr[i][2] == s && arr[i][3] == m) {
                System.out.println(i+1);
                break;
            }
        }
    }
}

 

 

해결방법

국가의 등수 => (자신보다 더 잘한 나라 수) + 1

국가번호와 금, 은, 동 각각의 메달 수를 입력받아 2차원 배열에 저장하고 금, 은 , 동 순으로 2차원 배열을 정렬하였다.

입력받을 때 등수를 알고 싶은 국가(k)의 금, 은, 동 각각의 메달 수를 변수 g, s, m에 저장해두었다.

이후 반복문을 돌려 해당 국가의 금, 은 동 각각의 메달 수가 g, s, m과 같아지면 빠져나오도록 구현하였고 해당 국가의 금, 은 동 각각의 메달 수가 g, s, m과 같아진다는 것은 자신보다 더 잘한 나라의 수를 구한 것이니까 곧 등수를 알고 싶은 국가의 등수를 알 수 있다는 의미가 된다.