huginn muninn

[백준] 1205 파이썬 등수 구하기_구현 본문

코딩테스트

[백준] 1205 파이썬 등수 구하기_구현

_maddy 2024. 4. 9. 00:46

https://www.acmicpc.net/problem/1205

 

1205번: 등수 구하기

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보

www.acmicpc.net

 

내가 생각했을 때 이 문제에서 핵심은 순위 부여이다. 

ar=[10,9,8,7,6,5,5,4,3] 에 순위를 부여했을 때 

rank=[1,2,3,4,5,6,6,8,9] 로 순위를 부여하는 알고리즘을 일단 구현할 줄 알아야 한다. 

아래 코드로 순위를 부여할 수 있다. 

 

for i in ar:
    rank_count=1
    for j in ar:
        if i<j:
            rank_count+=1
    rank.append(rank_count)

 

 

그리고 순위를 구현했다면 조건에 유의해야한다. 

  • 랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 
    •  p가 10이면 10개만 들어갈 수 있음. 즉 1,2,2,3,4,5,6,7,8,9 일때 새로운 순위인 10위가 들어온다면 들어올 수 없다.
  • 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.
    • 숫자가 10,9,8,7,6,5,4,3,2,1 랭킹이 1,2,3,4,5,6,7,8,9,10이 있고 p가 10이라고 해보자 만약 1이 새롭게 들어온다면 이미 10개가 꽉차있기 때문에 들어오지 못하고 -1을 출력해야한다. 0이 들어와도 마찬가지. 
    • 그럼 만약 2가 들어왔다면? 2는 들어올 수 있다. 1이 밀려나기 때문.
  • 만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.
    • 숫자가 10,9,8,7,6,5,4,3,3,0이고 p가 10일 때 이미 꽉차있지만 만약에 2가 들어온다면 0이 밀리나기 때문에 점수가 바뀔 수 있다. 
#등수구하기 1205

#N,새로운 점수,P:랭킹리스트에 올라갈 수 있는 점수의 개수
#랭킹 리스트 

n,new,p=map(int,input().split())

ar=[]

#n이 0일 수도 있으니 조건 걸고 정렬해주기
if n!=0:
    ar=list(map(int,input().split()))
    ar.sort(reverse=True)


rank=[]
rank_count=1


if len(ar)!=0 and ar[-1]>=new and len(ar)==p:
    print(-1)
else:
    ar.append(new)
    ar.sort(reverse=True)

    for i in ar:
        rank_count=1
        for j in ar:
            if i<j:
                rank_count+=1
        rank.append(rank_count)

    index=0
    for i in range(len(ar)):
        if ar[i]==new:
            index=i

    print(rank[index])