알고리즘 문제 풀이/백준

[백준] 1205 등수 구하기

파란색 가운 2024. 2. 13. 15:41

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

 

1205번: 등수 구하기

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

www.acmicpc.net

 

시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 20859 5249 4355 25.938%

문제

태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.

이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.

예를 들어 랭킹 리스트가 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보다 큰 경우에만 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력 1 복사

3 90 10
100 90 80

예제 출력 1 복사

2

예제 입력 2 복사

10 1 10
10 9 8 7 6 5 4 3 2 1

예제 출력 2 복사

-1

예제 입력 3 복사

10 1 10
10 9 8 7 6 5 4 3 3 0

예제 출력 3 복사

10

예제 입력 4 복사

0 0 50

예제 출력 4 복사

1

 

특이했던점은 N = 0 / N >=1을 처음부터 구분해야 했다는 점

import sys
def nisbigthanone():
    ranklist = []
    rank.sort()
    for i in range(len(rank)):
     index = 1
     for j in range(i+1,len(rank)):
        if rank[i] < rank[j]:
            index +=1
     ranklist.append((rank[i],index))


    index = 1
    samecount = 0
    for i in ranklist:
     if i[0] > score:
        index +=1
     if i[0] == score:
        samecount +=1 
    
    if index + samecount <= P:
     ranklist.insert(N-1-index,(score,index))
     ranklist.sort()
    
    for i in range(len(ranklist)-1,0,-1):
       if ranklist[i][0] == score:
        index = ranklist[i][1]
    if index + samecount > P:
        print(-1)
    else:
        print(index)

N, score, P = map(int,sys.stdin.readline().split())
if N>=1:   
 rank = list(map(int,sys.stdin.readline().split()))
else:
   print(1)

if N >=1:
   nisbigthanone()

그래서 난 N>=1에 함수호출을 해주는방법을 사용했다

처음 ranklist에는 점수,등수를 한 배열에 같이 넣어줬고

넣고자 하는 새로운 원소의 등수, 같은 원소가 얼마나 있는지를 세주어야 한다

index + samecount 가 P를 넘어간다는 것은 새로 갱신하면 안되는 경우이므로 빼줬다

그리고 10분정도 삽질한거

index + samecount > P:로 해야하는데 N으로 두고 자꾸 틀렸다고 나와서

뭐가 문젠가 했었다.. 문제를 잘 읽자