본문 바로가기

Algorithm Problems/정렬

[백준/python] 8979번: 올림픽

문제

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

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각

www.acmicpc.net


문제 요약

N개 나라의 번호, 금메달 수, 은메달 수, 동메달 수를 입력받고 국가 K의 등수를 출력한다.

 

등수를 결정하는 규칙은

1. 금메달 수가 더 많은 나라

2. 금메달 수가 같으면, 은메달 수가 더 많은 나라

3. 금, 은메달 수가 모두 같으면 동메달 수가 더 많은 나라

 

만약 두 나라의 금, 은, 동메달의 수가 모두 같다면 두 나라는 등수가 같다.

또, 예를 들어 2,3번 국가가 점수가 같아 두 국가 모두 2등이라면

다음으로 성적이 좋은 국가는 3등이 아닌 4등이다.


코드

import sys
input = __import__('sys').stdin.readline

def main():
    N, K = map(int, input().rstrip().split()) 
    # N은 국가 수, K는 등수를 알고 싶은 국가

    arr = [list(map(int, input().split())) for _ in range(N)]
    # 반복문을 이용해 여러 줄의 데이터를 2차원 리스트로 저장

    arr = sorted(arr, key = lambda a: [-a[1], -a[2], -a[3]])
    # sorted와 lambda를 이용하여 여러 기준으로 정렬

    idx = [arr[i][0] for i in range(N)].index(K)
    # 국가 번호만으로 이루어진 리스트를 생성후 index를 이용해 국가 K의 인덱스 찾기

    for i in range(N):
        if arr[idx][1:] == arr[i][1:]:
            print(i+1)
            break

if __name__ == "__main__":
    main()

코드 설명

1. 입력 받을 국가 수 N, 등수를 알고 싶은 국가 번호 K를 입력받는다.

 

2. 반복문을 이용해 여러 줄의 데이터를 2차원 리스트로 저장한다.

 

3. sorted, lambda를 이용하여 주어진 기준으로 정렬한다.

 

4. 국가 번호만으로 이루어진 리스트를 생성 후 index를 이용해 국가 K의 인덱스를 찾는다.

 

5. 국가 K와 같은 등수가 있을 경우를 고려하여 반복문을 통해 국가 K와 금, 은, 동메달의 개수가 같은 인덱스를 찾고 1을 더해 출력한다.

 

여기서 예외가 있는지 고려할 경우의 수는 3가지 이다.

 

1. 국가 K와 같은 등수의 국가가 있을 때, 그 국가의 인덱스가 정렬한 배열에서 더 앞에 있다.

=> 반복문 안 조건문을 통해 그 국가의 인덱스를 먼저 만나기 때문에 i + 1을 출력한다.

 

2. 국가 K와 같은 등수의 국가가 있을 때, 국가 K의 인덱스가 정렬한 배열에서 더 앞에 있다.

=> 반복문 안 조건문을 통해 국가 K의 인덱스를 먼저 만나기 때문에 i + 1을 출력한다.

 

3. 국가 K와 같은 등수의 국가가 없다.

=> 반복문 안 조건문을 통해 국가 K의 인덱스를 만날 일 밖에 없기 때문에 i + 1을 출력한다.