포스트

백준 등수 구하기[1205번]

문제

백준 등수 구하기

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

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

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

랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다.

이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.

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

입력

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다.

P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다.

그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다.

둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다.

둘째 줄은 N이 0보다 큰 경우에만 주어진다.

출력

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

예제 입출력

입력 1

1
2
3 90 10
100 90 80

출력 1

1
2

입력 2

1
2
10 1 10
10 9 8 7 6 5 4 3 2 1

출력 2

1
-1

입력 3

1
2
10 1 10
10 9 8 7 6 5 4 3 3 0

출력 3

1
10

입력 4

1
0 0 50

출력 4

1
1

풀이

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
import sys

N,score,P=map(int,sys.stdin.readline().strip().split(" "))
 # N==0 일경우 
if N==0:
  print(1)

else:
  rank=list(map(int,sys.stdin.readline().strip().split(" ")))
  # N==P 일경우
  if N==P:
    temp=rank[:]
    rank.append(score)
    rank.sort(reverse=True)
    if temp==rank[:-1]:
      print(-1)
    else:
      print(rank.index(score)+1)

  # N<P일경우
  else:
    rank.append(score)
    rank.sort(reverse=True)
    print(rank.index(score)+1)

설명

주어진 조건을 잘 분석해보자

우선 N==0 일경우, 입력 값으로 주어지는 점수는 반드시 1등일수 밖에 없다.

왜냐하면, 조건에 따르면 P(등수로서 취급되는 점수의 갯수)가 반드시 10이상이고,

N==0 이므로 들어오는 점수는 등수로서 포함 될수 있고, 하나 밖에 없으므로 1등 일수 밖에 없다.

그럼 다음 다시 N==P일떄와 N<P일 경우로 나눌 수 있다.

N==P라면 입력으로 들어온 점수를 리스트에 추가해서 내림차순으로 정렬한다.

이떄 기존의 리스트와 비교해서 변화가 있다면, 랭킹의 영향을 준 것이므로 index 내장함수를 통해 등수를 구한다.

만약 기존의 리스트와 비교해서 변화가 없다면, 랭킹의 영향을 주지 못했으므로 -1을 출력한다

N<P일 경우 입력되는 점수는 반드시 랭킹리스트에 포함 될수 있으므로, 리스트에 추가해서 내림차순으로 정렬한다.

그런 다음 index 내장함수로 등수를 구한다.

조건만 잘 나누면 몇줄 안되는 코드로 해결 가능하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.