코딩 테스트 연습/백준 silver

[백준] S5. 올림픽 (Python)

카누가 좋아요 2023. 6. 17. 20:06

❓ 문제

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)를 작성할 때 이상하게 작성하여 한 번 틀렸던 문제였다.