[백준] S5. 올림픽 (Python)
❓ 문제
https://www.acmicpc.net/problem/8979
8979번: 올림픽
입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각
www.acmicpc.net
💡 해결하기
1️⃣
각 나라별로 각 국가를 나타내는 정수와 그 국가의 금, 은, 동메달 수를 입력받아 리스트로 만든다. (2차원 리스트)
입력이 모두 끝난 후에는 우선순위 금, 은, 동 순서대로 내림차순 정렬해야 한다.
따라서 0번째 요소인 국가를 나타내는 정수는 각 리스트의 맨 뒤쪽으로 옮겨준다.
2️⃣
각 국가의 기록들을 reverse=True 조건을 달고 내림차순 정렬한다.
3️⃣
내림차순 정렬한 리스트를 0번부터 하나씩 탐색하며 등수를 매긴다. (반복문 사용)
등수는 1, 기록이 동일한 국가의 수(자기 자신도 포함)는 1부터 시작한다.
➡️ 0번째 국가의 경우 무조건 1등이므로 전역변수 등수를 1로 만든다.
➡️ 그 다음부터의 국가의 경우 이전 국가와 메달 기록 부분을 비교하여 동일하면 등수는 그대로 유지하고 기록이 동일한 국가의 수를 1 증가시킨다.
➡️ 동일하지 않은 경우 기록이 동일한 국가의 수만큼을 등수에 더해준다.
기록이 동일한 국가의 수만큼 등수가 늘어나게 되는 것이다. 만약 기록이 동일한 전적이 없다면 그냥 등수가 하나 아래로 내려가게 된다.
4️⃣
위 과정 진행 중 우리가 등수를 알고 싶은 국가라면 현재 등수를 출력하고 반복문을 빠져나와 종료하면 된다.
💻 Python으로 코드 작성하기
n, k = map(int, input().split()) # 국가의 수, 등수를 알고 싶은 국가
record = []
for _ in range(n):
info = list(map(int, input().split())) # 한줄씩 입력받기
info.append(info.pop(0)) # info의 첫번째 요소는 국가를 나타내므로 맨 뒤로 보낸다.
record.append(info)
record.sort(reverse=True) # 금메달 수를 기준으로 내림차순(많은 것부터) 정렬 (금메달 수가 같을 경우 은메달, 동메달, 국가 번호 기준으로 차례로 기준을 움직이며 내림차순 정렬)
cnt = 1 # 동일한 기록을 가지고 있는 국가의 수 (자신 포함)
grade = 1 # 등수
for i in range(len(record)): # 각 국가의 기록 하나씩 탐색
if i == 0: # 1등인 국가라면 (맨 앞에 위치한 국가)
grade = 1 # 현재 등수 1로 수정
else: # 1등이 아닌 국가라면
if record[i][:3] == record[i-1][:3]: # 앞선 국가와 기록이 동일하다면
cnt += 1 # 동일 기록 국가 수 1 증가하고 등수는 변함 없이 그대로
else: # 앞선 국가와 기록이 다르다면
grade += cnt # 등수가 cnt만큼 건너뛰어야 함. (기록이 동일한 전적이 있다면 그만큼 아래로 감. 아닌 경우 그냥 등수 하나 아래로)
cnt = 1 # cnt는 다시 1로 초기화
if k == record[i][3]: # 우리가 찾고자 하는 국가라면
print(grade) # 등수 출력
break
🙂 돌아보기
반복문(for문) 부분의 범위(range)를 작성할 때 이상하게 작성하여 한 번 틀렸던 문제였다.