본문 바로가기
Baekjoon/[7] 기타

[백준] 8979번 올림픽 JAVA (자바) 풀이

by Poorm 푸름 2025. 2. 8.

문제 8979 (구현, 정렬)

 :  규칙을 따라 어느 나라가 더 잘했는지 결정한다.

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

 :  만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다

    예) 1등이 1번 국가고 2,3번 국가가 동점, 4번 국가 최하위라면 등수는 1-2-2-4(국가순) 이다 

 

 

[입력]


 :  입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000), 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)

 :  이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수

    (전체 메달 수의 총합은 1,000,000 이하)

  

 

 [출력]


 :  입력받은 국가 K의 등수

 

 

 [문제접근]

 

 1. 정렬 이용하자

 

  • 배열 정렬은 Arrays.sort!
  • 우리는 값이 큰 게 1등이니 내림차순!
Arrays.sort(intArr, (a, b) ->
	a - b  // 오름차순
);

Arrays.sort(intArr, (a, b) ->
	b - a  // 내림차순 
);

compare(x, y)는 x-y 라고 생각하고 풀 것

 

  •  람다식 이용하여 조건 달아주기
Arrays.sort(arr, (a, b) -> {
    if (a[0] != b[0]) return Integer.compare(b[0], a[0]); 
    if (a[1] != b[1]) return Integer.compare(b[1], a[1]);
    return Integer.compare(b[2], a[2]); 
});

 

 

 2. 정렬한 것과 별개로 마지막엔 메달 개수를 비교하고 같으면 이전 국가와 동일한 등수 출력

  • 메달 수 같으면 j+1 (+1을 하는 이유는 인덱스가 0부터 시작하기 때문)
  • 메달 수 다르면 rank++

 

 

 [코드]

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];
        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());
        }
        
        Arrays.sort(arr, (a, b) -> {
           if (a[1] != b[1]) return Integer.compare(b[1], a[1]); 
           if (a[2] != b[2]) return Integer.compare(b[2], a[2]);
           return Integer.compare(b[3], a[3]); 
        });
        
        int rank = 1;
        for (int i = 0; i < N; i++) {
            if (arr[i][0] == K) { 
                for (int j = 0; j < i; j++) {  
                    if (arr[i][1] == arr[j][1] && arr[i][2] == arr[j][2] && arr[i][3] == arr[j][3]) {
                        rank = j + 1; 
                        break;
                    }
                }
                System.out.println(rank);
                return;
            }
            rank++;
        }
    }
}

 

 

 

이제 풀어보러 갈께요 :)



 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *