코딩 테스트/백준

[Python] 백준 1205 등수 구하기

위시리 2025. 1. 24. 17:54

 

문제 분석

  • 노래마다 랭킹 리스트가 있음
  • 매번 게임을 할 때마다 얻는 점수가 비오름차순으로 저장
  • 랭킹 리스트의 등수는 위에서 부터 차례로, 점수가 같으면 그러한 점수의 등수 중 가장 작은 등수
  • P : 랭킹 리스트에 올라갈 수 있는 점수의 개수
  • n : 리스트에 있는 점수의 개수 - 비오름차순으로 주어짐
  • 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하라
  • 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1 출력

 

코드 설계

  • 새로운 점수를 입력하려고 하는데
    • 만약 랭킹 리스트가 꽉 찼다면 : 내 점수가 랭킹에 있는 점수 중 가장 작은 값보다 커야만 입력
    • 랭킹 리스트가 다 안찼다면 : 그냥 입력
  • 나의 등수는 동점이 있어도 맨 앞의 인덱스를 출력하니까 현재 인덱스 + 1 (0부터 시작)

 

정답 코드

import sys
input = sys.stdin.readline

n, s, p = map(int, input().split())
# n : 현재 랭킹에 있는 점수의 개수
# p : 랭킹에 등재될 수 있는 총 점수의 개수
# s : 내 노래 점수

if n == 0 :
    print(1)
    exit(0)

scores = list(map(int,input().split())) # len(scores) == n

# 랭킹 리스트가 다 찼다면
if len(scores) >= p :
    if min(scores) >= s :
        print(-1)
        exit(0)
    else :
        del scores[scores.index(min(scores))]
scores.append(s)
scores = sorted(scores, reverse=True)

# 랭킹 리스트에서 나의 랭킹 찾기 -> 동점자가 있어도 어차피 맨 앞의 인덱스를 출력하니까..
print(scores.index(s)+1)

 

다른 사람 코드 1

  • n == 0 인 경우와 n>0 인 경우
  • n == 0이면 10 <= p <= 50 이므로 랭킹은 1이 됨
  • n > 0인 경우에는
    • n == p  이면서 랭킹의 가장 작은 값보다 작으면 -1
    • 그 외의 경우에는 랭킹 점수를 for문으로 돌면서 랭킹 점수가 새로운 점수보다 작거나 같으면 그 등수가 새로운 점수의 등수
    • 없다면 n+1
n, new, p = map(int, input().split())

if n:
    scores = list(map(int, input().split()))
    scores.append(new)
    scores.sort(reverse=True)
    idx = scores.index(new) +1
    if idx > p :
        print(-1)
    else :
        if n == p and new == scores[-1] :
            print(-1)
        else :
            print(idx)
else :
    print(1)