[오늘의 문제] 등수 매기기

shlim55·2026년 1월 12일

코딩테스트

목록 보기
213/223

출처:

내가 한 풀이

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개 들어가는 거다.

  1. 주요 에러 원인 분석입력 형식 오류: p = int(input())으로 받으면 첫 줄의 첫 숫자만 가져오게 된다. 문제에서는 N, new_score, P가 한꺼번에 주어진다.

N이 0인 경우: 문제 조건에서 N=0N=0일 수 있다. N=0N=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)
profile
A Normal Programmer

0개의 댓글