[BOJ] 8979 - 올림픽 (🥈 실버 5티어)
사용 언어: Java
문제
풀이
나의 풀이
자바
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk = new StringTokenizer(in.readLine());
int N = Integer.parseInt(stk.nextToken()); // 전체 국가 수
int K = Integer.parseInt(stk.nextToken()); // 알고싶은 국가
ArrayList<int[]> info = new ArrayList<>();
for (int i=0; i<N; i++) {
stk = new StringTokenizer(in.readLine());
int[] tmp = new int[4];
for (int j=0; j<4; j++) {
tmp[j] = Integer.parseInt(stk.nextToken());
}
info.add(tmp);
}
// ✅ 정렬
info.sort((a, b) -> { // a와 b는 모두 array 타입
int gold_A = a[1];
int gold_B = b[1];
int silver_A = a[2];
int silver_B = b[2];
int bronze_A = a[3];
int bronze_B = b[3];
if (gold_A == gold_B) {
if (silver_A == silver_B) {
return bronze_B - bronze_A; // 3. 동이 많은게 우승
}
return silver_B - silver_A; // 2. 은이 많은게 우승
}
return gold_B - gold_A; // 1. 금이 많은게 우승
});
// ✅ 순회하면서 같으면 공동순위, 그 다음은 순위 밀리게
int grade = 0; // 등수
int cnt = 0; // 하나씩 카운트 (공동등수 다음 등수를 위해)
String previous = ""; // 금은동 -> ex. 120 010 010 001
for (int[] arr : info) {
cnt++;
String tmp = String.join("", Arrays.asList(Arrays.copyOfRange(arr, 1, 4))); // array(배열)을 리스트로 변환 (join은 리스트만 사용 가능하기 때문)
if (tmp.equals(previous)) {
// ✅ 같으면 공동순위라는 의미 (grade를 갱신하지 않는다)
} else {
grade = cnt; // grade 갱신
previous = tmp; // previous 갱신
}
if (arr[0] == K) { // ✅ 알고싶은 국가라면
out.write(grade + "\n"); // 등수 출력
break;
}
}
out.close();
in.close();
}
}
- 테스트 케이스: 성공
- 제출 결과: 성공
💛 개인 공부 기록용 블로그입니다. 👻