[BOJ: 1205] - Python / 파이썬 - 등수 구하기

o_jooon_·2024년 3월 12일
0

BOJ

목록 보기
40/49
post-thumbnail

서론

구현 문제입니다.
index()를 활용하여 간단하게 구하였습니다.

난이도

실버 4


문제

조건

시간 제한메모리 제한
2 초128 MB

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

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

예를 들어 랭킹 리스트가 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

3 90 10
100 90 80

예제 출력 1

2

예제 입력 2

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

예제 출력 2

-1

예제 입력 3

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

예제 출력 3

10

예제 입력 4

0 0 50

예제 출력 4

1

풀이

n이 0일 경우, 랭킹 리스트를 입력받지 않으면서 랭킹에 score 하나만 있게 되므로 1등을 출력하고 종료하면 됩니다.
아닌 경우, 랭킹 리스트를 입력 받고 score를 더한 후 다시 내림차순으로 정렬을 해줍니다.
rank.index(score)를 통해 입력한 점수의 인덱스(같은 점수여도 가장 앞 인덱스이기 때문에 등수가 됩니다.)를 구하고 1을 더해줍니다.

조건에서 랭킹 리스트에 등록할 수 없으면 -1을 출력해야 하므로, 조건을 찾아줍니다.

  • 등록 불가능인(-1을 출력해야 하는) 경우
  1. 현재 등수가 랭킹 리스트 범위 밖(p 이내)인 경우
  2. 동일한 점수가 랭킹 리스트의 범위와 같으면서 꼴찌와 같은 경우
    -> 30 20 10 의 랭킹 리스트에서 입력 받은 점수가 10이고 p가 3이라면, 이미 10이 있기 때문에 등록할 수 없음

해당 조건에 부합하면 -1을 출력, 아니면 원래 등수를 출력해줍니다.

코드

import sys
input = sys.stdin.readline

n, score, p = map(int, input().split())
if n == 0:		# n이 0일 경우 1 출력 후 종료
    print(1)
else:
				# 입력받은 score를 새로 입력 받는 점수 리스트에 추가하고 다시 내림차순 정렬
    rank = sorted([score] + list(map(int, input().split())), reverse=True)
    idx = rank.index(score) + 1		# score의 등수 찾기
									# 랭킹에 등록 가능하면 등수 출력, 아니면 -1 출력
    print(-1 if idx > p or (n == p and score == rank[-1]) else idx)

실행 결과

profile
안녕하세요.

0개의 댓글