Algorithm

[python]백준 8979번: 올림픽(implementation)

emhaki 2023. 1. 10. 16:17
728x90
반응형
SMALL

# 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 = map(int, input().split())
grade = []
for _ in range(n):
  list_ = list(map(int, input().split()))
  grade.append(list_)

grade = sorted(grade, key = lambda x : (-x[1], -x[2], -x[3]))

for i in range(n):
  if grade[i][0] == k:
    idx = i

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

📝 풀이

금, 은, 동에 따라 순위가 결정되는데 순위가 결정되는 규칙은 다음과 같다.

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

문제 자체는 그렇게 어렵지 않았으나 동순위를 어떻게 처리할 것인가에 대한 아이디어가 관건인 것 같다. 처음에는 아래와 같이 엉터리 코드를 작성했다.

import itertools
n, k = map(int, input().split())

grade = [[] for _ in range(n)]

for i in range(len(grade)):
  grade[i].append(list(map(int, input().split())))
dp = [0] * n
cnt = 1
eq = 0
grade = sorted(grade, key = lambda x : (-x[0][1], -x[0][2], -x[0][3]))
grade = list(itertools.chain(*grade))
print(grade)
for i in range(len(grade)-1):
  dp[i] = cnt
  cnt += 1
  if grade[i][1:] == grade[i+1][1:]:
    eq = 1
  if eq == 1:
    dp[i] -= 1
    dp[i+1] -= 1
    eq -= 1
print(dp[k])

입력값도 이상하게 받았다. 저렇게 받게 되면 3중리스트가 되어서 lambda 정렬할 때에도 한층 복잡하게 했고, 불필요하게 itertools.chain으로 리스트를 벗겨주는 작업을 해야했다. if문 처리도 이상하게 했는데 탐색 인덱스 다음 인덱스랑 같다면 eq에 1을 추가하고 dp에서 -1을 차감해주는 방식을 코드를 작성했다. 예제에 있는 입력값에는 동일 결과가 나오지만, 범위 설정도 이상했고, 예외 케이스를 모두 만족시킬 수 없는 코드였다.

🔓 정답 코드 뜯어보기

n, k = map(int, input().split())
grade = []
for _ in range(n):
  list_ = list(map(int, input().split()))
  grade.append(list_)

grade = sorted(grade, key = lambda x : (-x[1], -x[2], -x[3]))

for i in range(n):
  if grade[i][0] == k:
    idx = i

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

입력값을 조금 더 단순하게 처리했고, 동일하게 lambda 함수를 사용해서 금, 은, 동 순으로 정렬했다.

for문을 돌리면서 국가 index값이 k값이랑 같을 때의 리스트 idx를 저장시켜줬다. 동일하게 for문을 돌면서 찾아야하는 idx와 같은 금, 은, 동이 있다면 i에 1을 더한 값을 출력해준다.

728x90
반응형