[BOJ: 8979] - Python / 파이썬 - 올림픽

o_jooon_·2024년 3월 6일
0

BOJ

목록 보기
39/49
post-thumbnail

서론

구현 문제입니다.
정렬을 통해 순서를 정해준 후 풀어야 합니다.

난이도

실버 5


문제

조건

시간 제한메모리 제한
1 초128 MB

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

금메달 수가 더 많은 나라
금메달 수가 같으면, 은메달 수가 더 많은 나라
금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
각 국가는 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의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.


서브태스크

번호배점제한
18예제 입력, 출력
212N = 2
320모든 국가의 은메달 및 동메달 획득 수는 0
425N ≤ 500
535추가적인 제약 조건은 없다.

예시

예제 입력 1

4 3
1 1 2 0
2 0 1 0
3 0 1 0
4 0 0 1

예제 출력 1

2

예제 입력 2

4 2
1 3 0 0
3 0 0 2
4 0 2 0
2 0 2 0

예제 출력 2

2

풀이

같은 등수의 나라를 확인하기 위해 다양한 방법을 생각했습니다만, 100점으로 통과하기 어려웠습니다.
결국 간단하게 k번째 나라의 메달만 따로 저장해주어 쉽게 100점 통과가 가능했습니다.

입력 시, 나라 번호를 제외한 금메달, 은메달, 동매달만 따로 배열(rank)에 저장합니다.
나라의 번호가 k와 동일할 시엔 이 메달의 갯수를 따로(tmp) 저장합니다.
이 후, rank를 내림차순으로 정렬해주어 등수를 설정해주면 됩니다.

정렬된 rank를 순차적으로 탐색하며 tmp와 같은 메달이면 바로 출력을 해줍니다.
-> 같은 메달은 모두 같은 등수이기 때문에, 동일한 메달 수 중 가장 앞의 값의 인덱스가 곧 순위가 됩니다.

코드

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
rank = []									# 순서를 위한 배열

for _ in range(n):
    c, g, s, b = map(int, input().split())	# 나라, 금, 은, 동 순 입력
    rank.append((g, s, b))					# 메달만 rank 배열에 추가

    if c == k:								# 확인할 나라의 등수를 체크하기 위해
        tmp = (g, s, b)						# tmp에 해당 나라의 메달 수 저장

rank.sort(reverse=True)						# rank배열 내림차순으로 정렬

for i in range(n):
    if rank[i] == tmp:						# 순차적으로 rank를 탐색하며 찾아야 할 나라의 메달 수를 찾고
        print(i + 1)						# 해당 인덱스 + 1(순위)를 출력
        break								# 출력 후 반복문 종료

실행 결과

profile
안녕하세요.

0개의 댓글