[python] 백준 1205번 - 등수 구하기

희희구리·2023년 4월 20일
0

백준

목록 보기
11/21
post-thumbnail

문제

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

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

예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다

랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.

만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.

링크 참조

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

풀이 설명

예제로 이해하는 것이 편하다.
N=3, 태수점수=90, P=10이 주어진다면 이는, 3개의 점수가 들어가있을 때
태수의 점수는 90점이고 총 10개의 점수 배열까지 담을 수 있음 이라는 뜻이다.

주어진 3개의 정수는 [100, 90, 80] 이고 태수의 점수는 90이니까 100, 90, 90, 80 이 되어 태수의 등수는 2등이 된다. (대신, 80점은 4등이 됨)

이런식으로 태수의 등수가 랭크 안에 들 수 있는지, 들었다면 몇 등인지 출력하면 된다.
만약, 태수의 점수가 랭크 안에 들 수 없다면 -1을 출력하고
랭크 배열은 N이 0보다 클 때만 주어진다고 한다.

코드

ver1.
N, Taesu, P = map(int,input().split())

if N>0:
    Ranklist = list(map(int,input().split()))
    if len(Ranklist) < P:
        if Taesu in Ranklist:
            index = Ranklist.index(Taesu) + 1
            print(index)

        else:    
            Ranklist.append(Taesu)
            Ranklist.sort(reverse=True)
            index = Ranklist.index(Taesu) + 1
            print(index)
    else:
        Ranklist.sort(reverse=True)
        if Ranklist[-1] < Taesu:
            Ranklist.pop(-1)
            Ranklist.append(Taesu)
            Ranklist.sort(reverse=True)
            index = Ranklist.index(Taesu) + 1
            print(index)
        else:
            print(-1)
else:
    print(1)

이 코드가 시간이 4ms 더 빠르다.

ver2.
N, Taesu, P = map(int,input().split())

if N>0:
    Ranklist = list(map(int,input().split()))
    if len(Ranklist) < P:
        if Taesu not in Ranklist:
            Ranklist.append(Taesu)
            Ranklist.sort(reverse=True)
        index = Ranklist.index(Taesu) + 1
        print(index)    
    else:
        Ranklist.sort(reverse=True)
        if Ranklist[-1] < Taesu:
            Ranklist.pop(-1)
            Ranklist.append(Taesu)
            Ranklist.sort(reverse=True)
            index = Ranklist.index(Taesu) + 1
            print(index)
        else:
            print(-1)
else:
    print(1)

짧은 건 이쪽인데 .. 왜지?

처음으로 확인하는 것은 N의 크기이다. N이 0보다 커야만 두 번째 줄의 입력이 주어진다.
그 다음으로는, 랭크 리스트에 차있는 요소의 개수를 확인한다.
리스트가 가득 차지 않았다면 태수의 점수를 넣을 수 있다.
따라서, len(랭크리스트) 값으로 해당 요소가 P (최대 배열 개수)를 넘는지 확인한다.
넘지 않는다면, 태수의 점수 값이 원래 Ranklist에 존재하는지 확인한다.
존재한다면 추가할 필요가 없기 때문이다.

태수의 값이 존재하지 않는다면 태수의 값을 추가한뒤 다시 정렬해준다. 내림차순으로

그 다음으로, 태수의 값이 몇 번째에 있는지 확인한다. index는 배열이기 때문에 실제 등수로는 +1만큼 해주면 된다.

태수의 값이 존재한다면, 그냥 태수의 위치를 찾은 다음에 +1 해주면 된다.
이 코드가 결국 존재하지 않은 경우와 유사하다는 것을 깨닫고 ver2에서는 정리해주었다.

랭크리스트의 길이가 P와 같거나 더 크다면, 랭크리스트의 정렬 후 맨 뒤 값 (가장 작은 값)보다 태수가 더 큰 지 확인한다.
태수의 점수가 최소값보다도 작으면 추가할 필요가 없기 떄문에 바로 -1을 출력한다.
만약, 최소값보다 크면 최소값을 빼고 태수의 점수를 넣는다.
그런 다음 다시 정렬하여, 태수의 값이 몇 번째에 위치하고 있는지 확인한다.
index는 +1 을 해줘야 함으로 index을 구한 후 출력한다.

💌

후기

지민이에서 탈출한 새로운 문제 "태수"
태수씨 정답 축하드려요 ^ ^

profile
beginner :>

0개의 댓글