문제
올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.
- 금메달 수가 더 많은 나라
- 금메달 수가 같으면, 은메달 수가 더 많은 나라
- 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라
각 국가는 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의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.
내가 쓴 코드 1 (45점짜리)
from sys import stdin; input = stdin.readline
# N : 국가 수, K : 등수 구할 나라
N, K = map(int, input().split())
# 국가, 금 수, 은 수, 동 수
lst = [list(map(int, input().split())) for _ in range(N)]
lst.sort(key=lambda x: (x[1], x[2], x[3]), reverse=True)
# rank 딕셔너리에 저장 -> 등수 : 나라 번호
rank = {}
for i in range(N):
rank[lst[i][0]] = i + 1
# 동점인 경우 처리
equal = 0
for i in range(N - 1):
if lst[i][1:] == lst[i+1][1:]:
equal += 1
else:
rank[lst[i][0]] -= equal
equal = 0
for i in range(N):
if lst[i][0] == K:
print(rank[K])
# 45점
내가 쓴 코드 2 (100점짜리)
from sys import stdin; input = stdin.readline
# N : 국가 수, K : 등수 구할 국가
N, K = map(int, input().split())
# 국가, 금 수, 은 수, 동 수
medals = [list(map(int, input().split())) for _ in range(N)]
medals.sort(key=lambda x: (x[1], x[2], x[3]), reverse=True)
# K 의 메달 수 : [금, 은, 동]
k_medal = [0] * 3
for i in range(N):
if medals[i][0] == K:
k_medal = medals[i][1:]
# 등수 구하기
# 등수 = 자신보다 더 잘한 나라 수 + 1
grade = 1
for i in range(N):
if medals[i][1:] == k_medal:
break
else:
grade += 1
print(grade)
# 100점
3일에 거쳐서 풀었다... 아니 백준 부분점수가 있는 문제는 처음이어서 당황했다,,, 맨날 너무 피곤해서 한 문제 끝내는데 3일이 걸렸다... 첫번쨰 코드를 이틀간 조금씩 한것이고, 두번째 코드를 오늘했다! 이튿날 혼자 풀어보고 풀이를 좀 찾아보면서 끝내고 자려했는데,, 끝내 끝내지 못하고 잤다. 정말 피곤이 몸을 지배해서 머리가 너무 안돌아갔거든...
근데 오늘 이 문제에 대해 좀 찾아보다가 문제에 힌트가 있다. 그것만 구해서 풀면 쉽게 풀리더라.. 라는 글을 보고 와 미친! 하고 다시 리셋하고 처음부터 풀어봤는데, wow 바로 100점 나와버렸자나 .... wow!! 그 힌트가 뭐냐면, " 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다." 라는 문장.. 진짜 이것만 구했더니 바로 걍 맞아버렸넹~ 이전 코드 어떻게 짠건지 생각도 안나용 ㅎㅎ 백준의 모든 문제들 입출력 테스트케이스 좀 많이 줬으면 좋겠다... 테케는 다 맞는데 틀렸다하면 너무 고통스러워요ㅠㅠ
제출 결과

'Algorithm > Python' 카테고리의 다른 글
| [BOJ #1463] 1로 만들기 (1) | 2024.04.04 |
|---|---|
| [BOJ #9934] 완전 이진 트리 (1) | 2024.04.04 |
| [BOJ #12789] 도키도키 간식드리미 (1) | 2024.03.29 |
| [BOJ #2805] 나무 자르기 (0) | 2024.03.28 |
| [BOJ #2839] 설탕 배달 (1) | 2024.03.26 |