본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 8979 올림픽

by 까망 하르방 2021. 2. 22.
반응형

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

 Input 

4 3

1 1 2 0

2 0 1 0

3 0 1 0

4 0 0 1

 

 Output 

2

 

국가별로 금, 은, 동 개수로 올림픽 순위를 구해보려고 합니다.

1. 금메달 수가 더 많은 국가

2. 금메달 수가 같으면 은메달 수가 더 많은 국가

3. 금, 은메달 수가 모두 같으면 동메달 수가 더 많은 국가

(개수가 동일하면 두 나라의 등수는 같습니다.)

 

* K 국가가 K 번째로 입력되는 것은 아닙니다.

 Input 

4 2

1 3 0 0

3 0 0 2

4 0 2 0

2 0 2 0

 

 Output 

2

① 금, 은, 동 우선순위별로 우선순위 큐에 넣는다.

② 큐에서 poll() 하면서 등수를 매긴다.

     (* 공동 순위 주의)


import java.util.PriorityQueue;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        int N = Integer.parseInt(sc.next());
        int K = Integer.parseInt(sc.next());
         
        PriorityQueue<Country> pq = new PriorityQueue<>();
        for(int i=1; i<=N; i++) {
            Country country = new Country(
                    Integer.parseInt(sc.next()), // 번호
                    Integer.parseInt(sc.next()), // 금
                    Integer.parseInt(sc.next()), // 은
                    Integer.parseInt(sc.next())  // 동
                );
            pq.offer(country);
        }
         
        // 1위 국가를 먼저 랭킹처리(시작 순위)
        Country preCountry = pq.poll();
        preCountry.rank = 1;
        if(K == preCountry.id) {
            System.out.println(preCountry.rank);
            return;
        }
         
        int rankCnt = 2;
        while(!pq.isEmpty()) {
            Country country = pq.poll();
            // 등수가 같은지 확인
            if(preCountry.gold == country.gold
                    && preCountry.silver == country.silver
                    && preCountry.bronze == country.bronze) {
                country.rank = preCountry.rank;
            }
            else {
                country.rank = rankCnt;
            }
             
            if(country.id == K) {
                System.out.println(country.rank);
                return;
            }
            preCountry = country;
            rankCnt++;
        }
    }
}
 
class Country implements Comparable<Country> {
    int id, gold, silver, bronze, rank; 
     
    public Country(int id, int gold, int silver, int bronze) {
        this.id = id;
        this.gold = gold;
        this.silver = silver;
        this.bronze = bronze;
    }
     
    @Override
    public int compareTo(Country target) {
        // 높은 숫자가 위로 오도록
        if (this.gold > target.gold)
            return -1;
        else if (this.gold < target.gold)
            return 1;
        else {
            // 은메달 비교
            if(this.silver > target.silver) {
                return -1;
            }
            else if(this.silver < target.silver) {
                return 1;
            }
            else {
                // 동메달 비교
                if(this.bronze > target.bronze) {
                    return -1;
                }
                else if(this.bronze < target.bronze) {
                    return 1;
                }
                return 1;
            }
        }
    }
     
    @Override
    public String toString() {
        return "[" + id + "] (" + gold + ", " + silver + ", " + bronze + ")";
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 7569 토마토  (0) 2021.02.22
[BOJ] 백준 7576 토마토  (0) 2021.02.22
[BOJ] 백준 3425 고스택  (0) 2021.02.22
[BOJ] 백준 2563 색종이  (0) 2021.02.22
[BOJ] 백준 17825 주사위 윷놀이  (0) 2021.02.22

댓글