대기업 코테 유형

(백준/파이썬) [Silver V] 올림픽 - 8979

난쟁이 개발자 2024. 9. 4. 03:23
반응형

[Silver V] 올림픽 - 8979

문제 링크

성능 요약

메모리: 110272 KB, 시간: 108 ms

분류

구현, 정렬

제출 일자

2024년 8월 16일 06:07:20

문제 설명

올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.

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

각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.

입력

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.

출력

출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.

 

풀이

힌트가 정렬, 구현 이라는데 어딜봐서 정렬, 구현이지 싶었다. 생각을 조금 더 해보자.

우선 올림픽 순위를 매기는 조건을 살펴볼 필요가 있다. 금, 은, 동 순으로 순위 중요도를 가진다. 그렇기 때문에 sort함수를 사용해서 금 은 동 순으로 정렬이 되도록 하였다. 당연히 내림차순으로 정렬하는 것이 좋겠다.

공동 순위에 대해서는 공동 1등 국가가 2이라면, 1, 1, 3, 4, ... 가 리턴되게 해야 했다. 나는 이 부분을 해결하지 못하여 문제를 잠시 내려놓았다. 
이 부분에 대해서 enumerate 메소드를 통하여 idx, (country, gold, silver, bronze) 를 묶은 다음, rank 에 i + 1 번째가 되도록 갱신하였으며, 이렇게 할 경우, 공동 순위도 자연스레 체크할 수 있었다. 

더보기
N, K = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]

# 금 은 동 순으로 정렬
arr.sort(key=lambda x:(x[1], x[2], x[3]), reverse=True)

# 등수 계산
rank = 1
prev_medals = arr[0][1:]
for i, (country, gold, silver, bronze) in enumerate(arr) :
    if (gold, silver, bronze) != prev_medals :
        rank = i + 1
    if country == K :
        print(rank)
        break

    prev_medals = (gold, silver, bronze)

코드를 보면, 금 은 동 각 메달의 수가 다르면 순위를 증가 시켰다. 이미 금 은 동 순으로 정렬을 하였기 때문에 큰 문제가 되지 않는다. 

만약 동일한 메달의 수를 가진 국가가 다수 발생할 경우에는, 첫 번째 if 인 prev_medals와 같냐는 조건을 그대로 통과하고, 두 번째 if문으로 바로 가기 때문에 공동 순위도 체크할 수 있다. 그리고 그 다음 국가에 대해서 공동 순위 국가를 idx 만큼 제거하기 때문에 자연스레 공동 순위에 대해서도 체크할 수 있게 된다. 

이번 문제를 풀면서 너무 어렵게 생각하였더니 오히려 풀지 못하게 되는 경우가 발생하였다. 해당 문제를 푼 알고리즘 코드를 보면 우리가 흔히 쓰던 문법으로 되어있기 때문에 쉽게쉽게 생각하는 것도 필요해 보인다.

반응형