문제
- 문제 출처 : https://www.acmicpc.net/problem/8979
올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.
- 금메달 수가 더 많은 나라
- 금메달 수가 같으면, 은메달 수가 더 많은 나라
- 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.
각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.
입력
입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.
출력
출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.
서브태스크
1 | 8 | 예제 입력, 출력 |
2 | 12 | N = 2 |
3 | 20 | 모든 국가의 은메달 및 동메달 획득 수는 0 |
4 | 25 | N ≤ 500 |
5 | 35 | 추가적인 제약 조건은 없다. |
1. 각 국가의 금,은,동 메달의 수를 저장하기 위해 2차원 배열을 생성한다.
-> medals[N+1][3] // 국가의 번호가 1부터 시작하기때문에 인덱스0은 쓰지않고 1~N까지 사용.
2. 주어진 조건을 만족하는 코드를 작성한다.
- 금메달 수가 더 많은 나라
- 금메달 수가 같으면, 은메달 수가 더 많은 나라
- 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
-> 등수를 구하고자 하는 국가 K와 나머지 국가들을 하나씩 비교하는데, 위의 조건을 순서대로 분류하여
하나의 조건을 만족하면(K보다 더 잘한 나라가 있다면) count를 +1해주고 빠져나가 다음 반복문을 수행한다.
k 국가의 등수는 count(자신보다 더 잘한 나라 수) + 1이다.
package implementaion;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.io.IOException;
public class Bj8979_올림픽 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[][] medals = new int[N + 1][3];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine(), " ");
int country = Integer.parseInt(st.nextToken());
for (int j = 0; j < 3; j++) {
medals[country][j] = Integer.parseInt(st.nextToken());
}
}
System.out.println(getPrize(medals, N, K));
}
public static int getPrize(int[][] medals, int N, int k) {
int count = 0;
for (int i = 1; i <= N; i++) {
if (i == k) // 비교값이 k국가일때는 패스
continue;
else {
if (medals[k][0] < medals[i][0]) { // k나라보다 금메달이 많은 나라 i count
count++;
continue;
} else if (medals[k][0] == medals[i][0]) { // k나라와 금메달의 수가 같음.
if (medals[k][1] < medals[i][1]) { // k나라보다 은메달이 많은 나라 i count
count++;
continue;
} else if (medals[k][1] == medals[i][1]) {// k나라와 은메달의 수가 같음.
if (medals[k][2] < medals[i][2]) {// k나라보다 동메달이 많은 나라 i count
count++;
}
}
}
}
}
return count + 1;
}
}
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
백준 2559 수열 (Java/자바) 슬라이딩 윈도우 (0) | 2024.10.29 |
---|---|
[백준] 1260 DFS와BFS (자바/java) (0) | 2021.12.22 |
[백준] 1991 트리 순회(자바/java) (0) | 2021.12.14 |
[백준] 2563 색종이 (자바/java) (0) | 2021.12.03 |
[백준] 1063 킹 (자바/java) (0) | 2021.12.03 |