출처:
내가 한 풀이
p = int(input('점수의 개수'))# 랭킹 리스트에 올라 갈 수 있는 점수의 개수
rank_list = [] # 점수가 들어갈 랭크 리스트
rank = [] # 랭킹
for i in range(0, p):
a = int(input('점수 입력'))
rank_list.append(a)
rank_list.sort(reverse=True)
print(rank_list)
rank_num = 1
rank.append(rank_num)
for i in range(1, len(rank_list)):
if i != len(rank_list) and (rank_list[i - 1] == rank_list[i]):
rank.insert(i, rank_num)
rank.append(i + 1)
rank_num += 1
print(rank)
트러블 슈팅
for i in range(1, len(rank_list)):
if i != len(rank_list) and (rank_list[i - 1] == rank_list[i]):
rank.insert(i, rank_num) # 이 줄에서 rank에 추가하고
rank.append(i + 1) # 그런데 if문과 관계없이 여기서 또 추가함!
rank_num += 1
같은 점수일 때 rank.insert(i, rank_num)로 추가한 다음, 무조건 rank.append(i + 1)도 실행되기 때문에 숫자가 2개 들어가는 거다.
N이 0인 경우: 문제 조건에서 일 수 있다. 이면 rank_list가 비어있게 되어 반복문이나 정렬에서 에러가 날 수 있다.
리스트 크기 초과: rank.insert(i, rank_num)와 rank.append(i + 1)를 동시에 사용하면 리스트 길이가 기하급수적으로 늘어나 메모리 초과나 인덱스 에러가 발생할 수 있다.
고친 코드문
import sys
# 1. 입력 받기 (N: 현재 개수, new_score: 태수 점수, P: 랭킹 제한)
# sys.stdin.readline을 쓰면 더 빠르고 안전합니다.
line = sys.stdin.readline().split()
if not line:
exit() # 입력이 없으면 종료
n, new_score, p = map(int, line)
# 2. N이 0이라면? (예외 처리)
if n == 0:
print(1)
exit()
# 3. 현재 랭킹 리스트 입력 받기
scores = list(map(int, sys.stdin.readline().split()))
# 4. 랭킹 진입 가능 여부 확인
# 리스트가 꽉 찼는데(n == p), 맨 마지막 점수보다 내 점수가 작거나 같으면 진입 불가
if n == p and scores[-1] >= new_score:
print(-1)
else:
# 5. 등수 계산 (나보다 점수 높은 사람 수 + 1)
res = 1
for s in scores:
if s > new_score:
res += 1
else:
break
print(res)