코테/백준

[백준/JAVA] 8979번: 올림픽

imname1am 2023. 6. 24. 14:55
반응형

🔺 문제

 

8979번: 올림픽

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

www.acmicpc.net

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, K;
    static ArrayList<Node> list = new ArrayList<>();
    static int endPoint = 0;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        N = Integer.parseInt(st.nextToken());   // 국가 수
        K = Integer.parseInt(st.nextToken());   // 등수 알고 싶은 국가
 
        // 입력 받기
        while(N --> 0) {
            st = new StringTokenizer(br.readLine(), " ");
            int num = Integer.parseInt(st.nextToken());
            int gold = Integer.parseInt(st.nextToken());
            int silver = Integer.parseInt(st.nextToken());
            int bronze = Integer.parseInt(st.nextToken());
            
            list.add(new Node(num, gold, silver, bronze, 0));
        }
        
        Collections.sort(list);
        list.get(0).rank = 1;    // 🔔 정렬 후, 리스트의 첫 번째 국가는 1등
        
        // 🔔 등수 매겨주기 (리스트의 이전 원소와 비교) 🔔
        for(int i = 1 ; i < list.size() ; i++) {
            Node now = list.get(i);
            
            int prevG = list.get(i - 1).g;
            int prev= list.get(i - 1).s;
            int prevB = list.get(i - 1).b;
            
            // 국가 번호가 K면, 그것이 바로 endPoint (마지막 정답 출력 시 사용)
            if(list.get(i).num == K) {
                endPoint = i;
            }
            
            if(now.g == prevG && now.s == prevS && now.b == prevB) {
                list.get(i).rank = list.get(i - 1).rank;
            }
            else {
                list.get(i).rank = i + 1; // 🔔
            }
        }
        
        
        // 찾는 등수 원소 구하기
        System.out.println(list.get(endPoint).rank);
    }
}
 
class Node implements Comparable<Node>{
    int num, g, s, b, rank;
    
    Node(int num, int g, int s, int b, int rank) {
        this.num = num;
        this.g = g;
        this.s = s;
        this.b = b;
        this.rank = rank;
    }
    
    // 메달, 내림차순 정렬
    @Override
    public int compareTo(Node n) {
        if(this.g == n.g) {
            if(this.s == n.s) {
                return n.b - this.b;
            }
            else {
                return n.s - this.s;
            }
        }
        else {
            return n.g - this.g;
        }
    }
}
cs
✅ 해결 아이디어
✔ 구현 / 시뮬레이션
- 순위를 알고 싶은 나라를 기준으로 정하고, 그것보다 금메달이 많은 나라가 있으면 rank +1 하는식으로
    → 금메달 수가 같다면, 은메달 수 비교
    → 은메달 수가 같다면, 동메달 수 비교

 

 

점수 결과 보여주는 거 귀여워...


🔺 다른 풀이들

- 코드 순서가 약간 다름

 

백준 8979 올림픽[Java]⭐

ArrayList, compareTo 함수를 작성할 때 여러 개의 if-else문을 만들기보다 return o.gold - this.gold; 와 같이 작성하자.

velog.io

 

 

- 객체 클래스 따로 안 만드시고 2차원 배열 사용해서 푸심. 폼 미쳤다이

 

로그인

 

www.acmicpc.net

 

 

- 와 어떻게 이런 생각을 하지? 진짜 폼 미쳤다이 X2 (플래티넘 분이셨다고 한다)

 

로그인

 

www.acmicpc.net


💬 느낀 점

1) 조건식이 생각보다 간단해서 놀람...

2) 노드 클래스 만들면 되겠지 와 여기까지 생각해내는 단계가 되었따!!하고 뿌듯해하다가

결국 시간 내에 못 품...

굳이 저렇게까지 할 필요가 없었기 때문에(?)

 

암튼 반성.. 분발...

 

 

 

1회독 2회독 3회독 4회독 5회독
V 11.28      

 

 

(+ 11.28 2회독 / 38분)

용케 혼자 풀긴 했다네요....뿌듯..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, K;
    static Country[] countries;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        N = Integer.parseInt(st.nextToken());   // 국가 수
        K = Integer.parseInt(st.nextToken());   // 등수 알고 싶은 국가
        
        countries = new Country[N];
        for(int i = 0 ; i < N ; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int num = Integer.parseInt(st.nextToken()); 
            int gold   = Integer.parseInt(st.nextToken());
            int silver = Integer.parseInt(st.nextToken());
            int bronze = Integer.parseInt(st.nextToken());
            
            countries[i] = new Country(num, gold, silver, bronze, 0);
        }
        
        Arrays.sort(countries);
        
 
        // 등수 매기기
        countries[0].rank = 1;
        int cnt = 1;    // 겹치는 개수
        
        for(int i = 1 ; i < N ; i++) {
            if(countries[i - 1].g != countries[i].g) {
                countries[i].rank = countries[i - 1].rank + cnt;
                cnt = 1;
            }
            else {
                if(countries[i - 1].s != countries[i].s) {
                    countries[i].rank = countries[i - 1].rank + cnt;
                    cnt = 1;
                }
                else {
                    if(countries[i - 1].b != countries[i].b) {
                        countries[i].rank = countries[i - 1].rank + cnt;
                        cnt = 1;
                    }
                    else {
                        countries[i].rank = countries[i - 1].rank;
                        cnt++;
                    }
                }
            }
        }
        
        // K의 등수 찾기
        for(Country c : countries) {
            if(c.num == K) {
                System.out.println(c.rank);
                return;
            }
        }
    }
}
 
class Country implements Comparable<Country> {
    int num, g, s, b, rank;
    
    public Country(int num, int g, int s, int b, int rank) {
        this.num = num;
        this.g = g;
        this.s = s;
        this.b = b;
        this.rank = rank;
    }
    
    @Override
    public int compareTo(Country o1) {
        if(this.g != o1.g)
            return o1.g - this.g;
 
        if(this.s != o1.s)
            return o1.s - this.s;
        
        if(this.b != o1.b)
            return o1.b - this.b;
        
        return 0;
    }
}
 
cs

 


(참고)

✔ 풀이 참고

 

[백준 8979] 올림픽 -JAVA //le_effort//

올림픽 성공 시간 제한메모리 제한제출정답맞은 사람정답 비율1 초128 MB92853209264635.135%문제올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이

suhyeokeee.tistory.com

 

반응형