https://www.acmicpc.net/problem/1205
1205번: 등수 구하기
첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보
www.acmicpc.net
문제
태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.
이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.
예를 들어 랭킹 리스트가 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보다 큰 경우에만 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다.
내 풀이
N > 0 일때 3가지 경우로 나누어서 처리 했다.
1. 10등까지만 뽑는데(=p) 새 점수(=new_score)가 10등(= score[-1]) 점수보다 낮다면 -1 출력
2. p=10이고 새 점수가 10등 점수보다 낮지만, 기존 점수가 10등까지 없다면(= len(score)<p) 맨 뒤에 추가
3. 그 외에는 반복문을 돌며 점수 위치에 맞게 추가
동일 점수에 경우에는 동일 점수 맨 뒤에 추가해야하는게 맞지만, 사실 같은 점수여서 어디에 추가하던 티가 안난다.
예를들어, 기존 점수가 [100 90 90]이고 새로운 점수가 90이어도 어느 위치에 놔도 결국은 [100 90 90 90]이고 90은 맨 처음 90이 등장한 2등이기 때문이다.
# 31120kb 40ms
N, new_score, p = map(int, input().split())
if N == 0: # N = 0
print(1)
else: # N > 0
score = list(map(int, input().split()))
if len(score) == p and score[-1] >= new_score: # 맨 끝 점수보다 낮고 남은 자리없음 : -1
print(-1)
elif score[-1] >= new_score: # 맨 끝 점수보다 낮은데 아직 자리 남아있으면 : 리스트 추가
score.append(new_score)
print(score.index(new_score)+1) # index 번호 +1 = 등수
else:
for i in range(len(score)): # 새 점수 > 리스트 점수 : 그 자리에 insert
if new_score >= score[i]:
score.insert(i, new_score)
score = score[:p]
print(i+1)
break
이렇게 하다보니
다른 스터디원들의 코드를 보며 깨달은 사실:
위에 내가 나눈 2, 3 케이스는 결국
1. 새로운 점수를 리스트에 그냥 추가한다음
2. 정렬하고
3. 새로운 점수의 위치값(=등수)를 반환해주는 과정
이 동일하게 진행되는 것이라 간단하게 코드 수정이 가능했다.
# 31120kb 44ms
N, new_score, p = map(int, input().split())
if N == 0: # N = 0
print(1)
else: # N > 0
score = list(map(int, input().split()))
if len(score) == p and score[-1] >= new_score:
print(-1)
else:
score.append(new_score)
score.sort(reverse=True)
score = score[:p]
print(score.index(new_score)+1)
'파이썬 알고리즘 연습' 카테고리의 다른 글
[Python | 백준 2839번] 설탕 배달 (6) | 2024.03.14 |
---|---|
[Python | 백준 9012번] 괄호 (0) | 2024.03.14 |
[Python | 백준 2217번] 로프 (0) | 2024.03.12 |
[Python | 백준 26169번] 세 번 이내에 사과를 먹자 (2) | 2024.03.11 |
[Python | 백준 1969번] DNA (1) | 2024.03.11 |