알고리즘/백준
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과 같아진다는 것은 자신보다 더 잘한 나라의 수를 구한 것이니까 곧 등수를 알고 싶은 국가의 등수를 알 수 있다는 의미가 된다.