티스토리 뷰

반응형

문제

유진이가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.

이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.

예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다

랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 송유진의 새로운 점수가 주어진다. 이때, 송유진의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.

만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다. (예제 2)

입력

첫째 줄에 N, 송유진의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다. 둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다. 둘째 줄은 N이 0보다 큰 경우에만 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제

예제 입력 1 예제 출력 1
3 90 10
100 90 80
2
예제 입력 2 예제 출력 2
10 1 10
10 9 8 7 6 5 4 3 2 1
-1

 

풀이

랭킹리스트의 점수가 내림차순으로 주어지기 때문에 굉장히 간단한 문제라고 생각했는데, 예외적인 부분들을 생각하지 못해 계속 실패했었다. 예외적인 경우들은 다음의 경우들이다.

 

  1. 랭킹리스트의 모든 점수들보다 낮아 마지막에 랭크하게 되는 경우
  2. 랭킹리스트의 가장 낮은 점수와 동일해 올라갈 수 없는 경우
  3. 랭킹리스트가 비어있는 경우 (두 번째 줄이 입력으로 들어오지 않아 런타임 에러(NullPointer)가 발생할 수 있기 때문에 예외처리 필요)

위의 예외 경우들을 다음과 같이 처리했다.

 

  1. 랭킹을 -1로 초기화해둔 뒤 랭크리스트의 모든 점수와 비교했을 때 가장 낮아서 랭킹이 -1이며 n이 p보다 작은 경우 랭킹리스트의 마지막에 랭크시킨다.
  2. 랭킹이 -1은 아니지만 랭킹리스트가 꽉 차있고 가장 낮은 점수가 새로운 점수와 동일한 경우 랭킹리스트에 올라갈 수 없으므로 랭킹을 -1로 바꾼다.
  3. n이 0이 아닌(랭킹 리스트가 비어있지 않은) 경우에만 입력받는 과정을 진행한다.

위의 예외적인 경우들을 포함한 전체적인 풀이는 다음과 같다.

 

  1. answer을 -1로 초기화한다. 랭킹리스트가 꽉 차있고 새 점수가 랭킹리스트의 마지막 점수보다 낮을 때 따로 처리하지 않아도 -1을 반환할 수 있다.
  2. 랭킹리스트가 비어있지 않은 경우(n > 0) 새 점수가 랭킹리스트의 점수보다 크거나 같은 순간을 찾는다. 랭킹리스트의 마지막 점수를 알아야 하기 때문에 랭킹리스트의 점수보다 크거나 같은 순간을 찾게 되더라도 반복문을 종료하지 않는다.
  3. 랭킹리스트의 가장 마지막에 랭크하게 되는 경우와 랭킹리스트의 마지막 점수와 동일해 랭크하지 못하게 되는 경우를 처리한다.
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

fun main() {

    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = System.out.bufferedWriter()

    var st = StringTokenizer(br.readLine())
    val n = st.nextToken().toInt()
    val score = st.nextToken().toInt()
    val p = st.nextToken().toInt()
    var answer = -1

    var num = 0
    // 랭킹 리스트가 비어있지 않은 경우
    if (n > 0) {
        st = StringTokenizer(br.readLine())
        for (i in 1..n) {
            num = st.nextToken().toInt()
            if (answer < 0 && score >= num) {
                answer = i
            }
        }
    }

    // 점수가 낮아서 마지막에 랭크
    if (answer < 0 && n < p) answer = n + 1
    // 이전 점수보다 더 좋지 않아서 랭킹 리스트에 새로 올라갈 수 없음
    else if (n == p && num == score) answer = -1

    bw.write("$answer\n")
    bw.flush()
    bw.close()
    br.close()
}
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함