문제
유진이가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.
이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.
예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다
랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 송유진의 새로운 점수가 주어진다. 이때, 송유진의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.
만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다. (예제 2)
입력
첫째 줄에 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
나의 풀이
[Python(파이썬)]
n, newp, p = map(int, input().split())
if n != 0:
rank = list(map(int, input().split()))
else:
rank = []
cnt = rank.count(newp)
rank.append(newp)
rank.sort(reverse=True)
if rank.index(newp)+cnt > p-1:
print(-1)
else:
print(rank.index(newp)+1)
풀이 과정
이 문제에서 나올 수 있는 경우는 크게 3가지로 생각할 수 있다.
1. 등수가 제대로 나오는 경우
2. 점수가 랭킹 리스트에 올라갈 수 없는 경우
3. N = 0인 경우
1. 등수가 제대로 나오는 경우
N(리스트에 있는 점수) = 3
새로운 점수 = 90
P(랭킹 리스트에 올라 갈 수 있는 점수의 개수) = 10
리스트 = [100, 90, 80]
=> 추가 후 리스트 = [100, 90, 90, 80]
=> 점수에 대응하는 등수 = [1, 2, 2, 4]등 이다.
위의 예로 생각해보자
3 90 10이 주어진다면, 3개의 숫자 리스트가 주어지고 등수는 총 10등까지로 제한되어있을 때 90점은 몇등인가?
이 경우는 90점이 추가 되어도 리스트의 개수는 총 4개 밖에 안되기때문에 10등으로 제한되어있는 것과 상관없이 등수를 구할 수 있다.
2. 점수가 랭킹 리스트에 올라갈 수 없는 경우
N(리스트에 있는 점수) = 10
새로운 점수 = 1
P(랭킹 리스트에 올라 갈 수 있는 점수의 개수) = 10
리스트 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
=> 추가 후 리스트 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1]
=> 점수에 대응하는 등수 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1]등 이다.
위의 예로 생각해보자
10 1 10이 주어진다면, 10개의 숫자 리스트가 주어지고 등수는 총 10등까지로 제한되어있을 때 1점은 몇등인가?
이 경우는 1점이 추가 된다면 11개로 총 10등까지로 제한되어있기때문에 1개의 점수는 랭킹 밖으로 나갈 수 밖에 없다.
같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다. 라는 조건이 있기 때문이다.
추가 후 리스트 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1]
=> 점수에 대응하는 등수 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1]등 이다.
랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.
만약 새로 들어오는 점수가 3이었다면
추가 후 리스트 = [10, 9, 8, 7, 6, 5, 4, 3, 3, 2, 1]
=> 점수에 대응하는 등수 = [1, 2, 3, 4, 5, 6, 7, 8, 8, 10,-1]등으로 답은 8이 되었을 것이다.
3. N = 0인 경우 (※ EORError 주의)
N(리스트에 있는 점수) = 0
새로운 점수 = 3
P(랭킹 리스트에 올라 갈 수 있는 점수의 개수) = 3
리스트 = []
=> 추가 후 리스트 = [3]
=> 점수에 대응하는 등수 = [1]등 이다.
이 경우를 고려하지 않아서 런타임 에러(EORError)가 발생했다.
EORError - EOF란 파일의 끝(end of file) 을 의미
지금 이 문제에서 error가 발생한 이유는 n = 0이면 리스트의 값이 주어지지 않는데 이때 rank = list(map(int, input().split()))를 한다면 입력값이 아무것도 주어지지 않는 것이다. 따라서 아래와 같이 처리를 해주어야한다.
n, newp, p = map(int, input().split())
if n != 0:
rank = list(map(int, input().split()))
else:
rank = []
위와 같이 n이 0이 아닐때만 다음 입력 값을 받을 수 있게 해서 error가 나지 않게 처리해줘야한다.
문제 출처
1205번: 등수 구하기
첫째 줄에 N, 송유진의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000
www.acmicpc.net
'[Python] Baekjoon > Brute force(브루트포스)' 카테고리의 다른 글
[백준(Baekjoon)] 2578 빙고 (0) | 2021.10.04 |
---|---|
[백준(Baekjoon)] 1032 명령 프롬프트 (0) | 2021.10.03 |
[백준(Baekjoon)] 2535 아시아 정보올림피아드 (0) | 2021.10.03 |
[백준(Baekjoon)] 2246 콘도 선정 (0) | 2021.10.02 |
[백준(Baekjoon)] 10799 쇠막대기 (0) | 2021.09.30 |
댓글