문제
태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.
이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.
예를 들어 랭킹 리스트가 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보다 큰 경우에만 주어진다.
풀이
정답률이 낮은 이유가 있었다... 예시 입출력만을 만족하는 코드를 작성했다간 한번에 정답을 맞히기 쉽지 않다. 기존 랭크들의 값을 순회하며 조건에 따라 랭킹 변수의 값을 변경하고 출력한다. 값이 한 번 출력되면 바로 프로그램을 종료하기 위해 sys.exit()을 사용하였다.
첫 번째 코드
import sys
input = sys.stdin.readline
n, t, p = map(int, input().split())
if n == 0:
print(1)
else:
cnt = 0
rank = list(map(int, input().split()))
for sc in rank:
if (
sc < t
or (sc == t and sc != rank[-1])
or (sc == t and sc == rank[-1] and n < p)
):
print(cnt + 1)
sys.exit()
elif sc == t and sc == rank[-1] and n == p:
print(-1)
sys.exit()
else:
cnt += 1
if cnt == p:
print(-1)
sys.exit()
print(cnt + 1)
for문 안에서 모든 조건들을 하나하나 검사하고 매번 sys.exit()를 호출해 코드가 복잡하고 효율성이 떨어진다.
출력값을 결정짓는 핵심 조건들만 파악해서 더 간략한 코드로 재구성하였다.
for문에서는 개수만 세기, for문 빠져나온 뒤 결과값 출력
: for문에서 t보다 큰 점수의 개수도 세고, 결과값 계산도 하려고 하니 코드가 복잡해졌다. 대신 for문에서는 점수의 개수만 세고, for문이 끝난 뒤 마지막에 결과값을 한 번만 계산하도록 수정하였다.
최종 코드
import sys
input = sys.stdin.readline
n, t, p = map(int, input().split())
if n == 0:
print(1)
sys.exit()
cnt = 0
rank = list(map(int, input().split()))
for sc in rank:
if sc > t: # t보다 큰 점수 개수 세기
cnt += 1
else:
break
if n < p or t > rank[-1]: # 자리가 남아있거나 제일 작은 점수보다 t가 클 때
print(cnt + 1)
else:
print(-1)
복잡했던 조건들이 사라지고 훨씬 코드가 간결해졌다.
for문은 t보다 큰 점수의 개수만 세고 빠져나오고, 결국은 t의 자리가 있으려면 랭킹에 빈 자리가 있거나/t가 랭킹의 최하위 점수보다 크거나 둘 중 한 경우일 때만 가능하다. 기존 코드에서는 t가 랭킹의 최하위 점수와 동일하면서 랭킹에 빈 자리가 있을 때/없을 때로 나눠가며 경우의 수 하나하나를 다 생각하려 했었는데, 크게 보니 간단한 조건이었다.
배운 것
- sys.exit(): c의 return 0;처럼 프로그램이 바로 종료된다.
'[Python] 백준 알고리즘 공부' 카테고리의 다른 글
| [Python] 9017. 크로스 컨트리 (0) | 2026.02.21 |
|---|---|
| [Python] 1244. 스위치 켜고 끄기 (0) | 2026.02.20 |
| [Phython] 20125. 쿠키의 신체 측정 (0) | 2026.02.20 |
| [Phython] 25757. 임스와 함께하는 미니게임 (2) | 2026.02.18 |
| [Phython] 4659. 비밀번호 발음하기 (0) | 2026.02.18 |