무서운 정답률에 비해선 매우 쉬운 문제였다.
코드의 주석을 확인하면 쉽게 이해할 수 있을 것이다.
자주 풀어본 문제라 구현에선 얼마 안걸렸지만, 97~98%에서 RunTimeError
가 떠버렸다!
문제의 원인은
보다시피 예제 4번에서는 입력받는 값 n이 0이기에 2번 째 줄을 받을 필요가 없었다.
근데, 이순간 종료시켜주지 않아서 뒤에 br.readLine()
에서 오류가 터져버린 것이였다~
다음엔 이런 사소한 점도 확실히 체크한 뒤, 넘어가도록하자!
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 newScore = Integer.parseInt(st.nextToken());
int p = Integer.parseInt(st.nextToken());
// 랭킹리스트에 값이 없다면 - 뒤에 더 받는 값이 없기에 여기서 종료
if(n==0){
System.out.println(1);
return;
}
st = new StringTokenizer(br.readLine(), " ");
int[] scores = new int[n];
for(int i=0;i<n;i++) {
int score = Integer.parseInt(st.nextToken());
scores[i] = score;
}
int result = solution(scores, n, newScore, p);
System.out.println(result);
}
private static int solution(int[] scores, int n, int newScore, int p) {
// 랭킹리스트가 가득차있으며, 가장 작은값보다 작거나 같다면 못넣음
if(n==p && scores[n-1] >= newScore)
return -1;
// 랭킹리스트에서 자기 위치 찾기
int rank = 1;
int prev = -1;
for(int i=0;i<n;i++) {
if(scores[i] > newScore){
// 같은 값이 여러개에 있을 경우, 맨 앞에 하나에 대해서만 rank 증가
if(scores[i] == newScore && prev == newScore)
continue;
rank++;
}
prev = scores[i];
}
return rank;
}
}