
내가 생각했을때 문제에서 원하는부분
입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다.
각 국가는 1부터 N 사이의 정수로 표현된다.
이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다.
전체 메달 수의 총합은 1,000,000 이하이다.
출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다.
등수는 반드시 문제에서 정의된 방식을 따라야 한다.
내가 이 문제를 보고 생각해본 부분
먼저 BufferedReader와 StringTokenizer를 사용해 입력을 빠르게 받는다.
배열 countries는 각 국가의 번호와 금, 은, 동메달 수를 저장한다.
입력받은 국가 중 등수를 알고 싶은 K 국가의 메달 정보를 따로 저장한다.
모든 국가를 순회하면서 K 국가보다 등수가 더 높은 국가가 있는지 비교해준다.
비교는 금 > 은 > 동 순서로 한다.
더 많은 메달을 가진 국가는 rank가 1씩 올라간다.
이렇게 rank가 최종적으로 계산되면 K 국가의 등수인 rank를 출력한다.
마지막에 리소스 누수를 막기 위해 br.close()로 스트림을 닫는다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 8979번 문제
public class Main1307 {
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[][] countries = new int[N][4]; // [국가 번호, 금, 은, 동]
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
countries[i][0] = Integer.parseInt(st.nextToken());
countries[i][1] = Integer.parseInt(st.nextToken());
countries[i][2] = Integer.parseInt(st.nextToken());
countries[i][3] = Integer.parseInt(st.nextToken());
}
int kGold = 0, kSilver = 0, kBronze = 0;
for (int i = 0; i < N; i++) {
if (countries[i][0] == K) {
kGold = countries[i][1];
kSilver = countries[i][2];
kBronze = countries[i][3];
break;
}
}
int rank = 1;
for (int i = 0; i < N; i++) {
if (countries[i][1] > kGold) {
rank++;
} else if (countries[i][1] == kGold) {
if (countries[i][2] > kSilver) {
rank++;
} else if (countries[i][2] == kSilver) {
if (countries[i][3] > kBronze) {
rank++;
}
}
}
}
System.out.println(rank);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.