본문 바로가기

알고리즘/백준 문제 풀이

[Python] 1205번 등수 구하기

728x90

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

 

1205번: 등수 구하기

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

www.acmicpc.net


 

22/10/10

 

 

단순 구현 문제로, 주어진 상황을 그대로 해석하여 문제를 구현하면 된다.


 

문제 접근 방식:

 

 

먼저 현재 랭킹 리스트에는 몇 명 있는지(N), 태수의 새로운 점수(new_score), 랭킹 리스트에 올라갈 수 있는 점수의 개수(P)가 주어진다.

 

먼저 경우의 수를 나눌 수 있다.

 

만약 현재 랭킹 리스트에 아무도 없는 상황이라면, 랭킹 리스트에 올라갈 수 있는 점수의 개수와는 무관하게 태수의 새로운 점수가 1등을 먹는다. 따라서, 1을 출력하면 된다.

 

그게 아닌 일반적인 상황이라면, 현재 랭킹 리스트를 입력받는다.

 

만약 현재 랭킹 리스트에 몇 명 있는지(N)가 랭킹 리스트에 올라갈 수 있는 점수의 개수(P) 보다 작다면, 태수가 아무리 못해도 꼴등은 가능하다.

 

예를 들어, 현재 랭킹 리스트가 10, 9, 8이고, 랭킹 리스트에 올라갈 수 있는 점수의 개수가 10개라면, 태수가 8점보다 낮은 점수를 받는다고 해도 꼴등이 가능하다.

 

때문에, 태수의 새로운 점수와 현재 랭킹 리스트에 있는 점수를 하나씩 비교해가며 태수의 랭킹을 정해주면 된다.

 

만약 그러지 않는다면(N==P), 현재 랭킹 리스트에 있는 꼴등이랑 태수 점수를 비교해보자.

 

꼴등이 태수 점수보다 높으면 태수는 랭킹에 못 올라가므로, -1을 출력하면 된다.

 

만약 꼴등이 태수 점수보다 낮으면, 위에서 비교한 과정을 그대로 따라가서 태수의 랭킹을 정해주면 된다.

 

이거를 구현하는 데에 유의해야 할 점은 같은 점수면 등수가 같이 나온다는 점, 그리고 그 등수는 제일 작은 등수로 정해진다는 점이다.


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 1205번 등수 구하기
# 구현
N, new_score, P = map(int, input().split())
if N == 0:
    print(1)
else:
    now_leader_board = list(map(int, input().split()))
    if len(now_leader_board) < P:
        rank = 1
        for score in now_leader_board:
            if score <= new_score:
                break
            rank += 1
        print(rank)
    else:
        if now_leader_board[-1] >= new_score:
            print(-1)
        else:
            rank = 1
            for score in now_leader_board:
                if score <= new_score:
                    break
                rank += 1
            print(rank)