[백준/JAVA] 8979번: 올림픽
🔺 문제
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 prevS = 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