1. 문제 링크
https://www.acmicpc.net/problem/1205
2. 문제

요약
- 등수는 위에서부터 몇 번째 있는 점수인지로 결정되고, 같은 점수는 가장 작은 등수로 등록됩니다. 랭킹 리스트에 올라갈 수 있는 개수는 정해져있어서 이 개수를 넘는 곳에 위치하게 된다면 그 점수는 랭킹 리스트에 올라갈 수 없습니다.
- 입력: 첫째 줄에서는 리스트에 있는 점수 개수, 새로운 점수, 랭킹 리스트에 올라갈 수 있는 점수의 개수를 입력받습니다. 둘째 줄에서는 리스트에 있는 점수 개수만큼 점수를 입력받습니다.
- 출력: 새로운 점수의 등수를 출력합니다.
3. 소스코드
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Arrays;
import java.util.Collections;
public class Main {
public int rank(int p, int score, Integer[] scores) {
Arrays.sort(scores, Collections.reverseOrder());
if(scores.length == 0) {
return 1;
} else if(scores.length == p) {
if(score == scores[scores.length - 1]) {
return -1;
} else {
int index = -1;
for(int i = 0; i < scores.length; i++) {
if(scores[i] <= score) {
index = i;
break;
}
}
if(index == -1) {
return -1;
} else {
return index + 1;
}
}
} else {
int index = -1;
for(int i = 0; i < scores.length; i++) {
if(scores[i] <= score) {
index = i;
break;
}
}
if(index == -1) {
return scores.length + 1;
} else {
return index + 1;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
StringTokenizer st = new StringTokenizer(input);
int n = Integer.parseInt(st.nextToken());
int score = Integer.parseInt(st.nextToken());
int p = Integer.parseInt(st.nextToken());
if(n != 0) {
input = br.readLine();
st = new StringTokenizer(input);
}
Integer[] scores = new Integer[n];
for(int i = 0; i < n; i++) {
scores[i] = Integer.parseInt(st.nextToken());
}
Main m = new Main();
System.out.println(m.rank(p, score, scores));
}
}
4. 접근
- 기존에 등록되어있는 점수가 없을 경우
- 등록되어 있는 것이 없기 때문에 새로운 점수는 항상 1등이 됩니다.
- 기존에 등록되어있는 점수가 랭킹 리스트에 올라갈 수 있는 점수의 개수만큼 등록되어 있는 경우
- 새로운 점수가 기존에 등록되어 있는 점수들 중에서 가장 작은 점수와 같다면, 이미 랭킹 리스트에 등록되어 있는 숫자만큼 등록이 되어 있기 때문에 문제에 의해 등록될 수 없습니다.
- 그렇지 않은 경우, 새로운 점수가 어디에 위치할지 위치를 찾고 그 위치가 랭킹 리스트에 등록될 수 있는 점수 개수를 넘어서는 경우에는 랭킹 리스트에 등록할 수 없습니다. 기존에 등록되어있던 점수들 사이에 위치할 수 있다면 해당 위치에 맞는 등수를 반환합니다.
- 중복되는 점수가 되는 경우에는 문제에 의해 가장 작은 등수로 등수가 측정된다고 하였으므로 가장 작은 등수로 반환합니다.
- 기존에 등록되어있는 점수가 랭킹 리스트에 올라갈 수 있는 점수의 개수보다 적은 경우
- 기존에 랭킹 리스트에 존재하고있는 점수의 개수가 랭킹 리스트에 올라갈 수 있는 점수의 개수보다 적으므로 새로 들어온 점수는 항상 랭킹 리스트에 등록될 수 있습니다.
- 새로운 점수가 위치할 곳을 등록된 점수들을 돌면서 찾고, 그 위치가 가장 끝이라면 기존에 등록되어있는 점수 개수 + 1을 반환하고 그렇지 않다면 해당 위치에 맞는 등수를 반환합니다.
- 중복되는 점수가 되는 경우에는 문제에 의해 가장 작은 등수로 등수가 측정된다고 하였으므로 가장 작은 등수로 반환합니다.