Post

(백준) 8979.올림픽 / with.정렬

문제링크: https://www.acmicpc.net/problem/8979

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys

n, k = map(int, sys.stdin.readline().rstrip().split())

b = []
for _ in range (n):
    a = list(map(int, sys.stdin.readline().rstrip().split()))
    b.append(a)

b.sort(key=lambda x: (-x[1], -x[2], -x[3]))
# print(b)

rank = 1 
for i in range(n):
    if i > 0 and b[i][1:] == b[i-1][1:]:
        pass
    else:
        rank = i + 1
    if b[i][0] == k:
        print(rank)
        break

풀이

  • sort 메서드 안에서 파라미터 값을 동시에 여러개 주고 싶다면 key값을 lambda로 주면됨.
    • 왜? 문제에서 금 - 은 - 동 이 많은 순서로 메달을 주라고 했으니까.
  • 이 때 리스트 앞에 - 부호를 붙이면, reverse=False로 준 것처럼 내림차순으로 정렬됨.
  • 동등한 조건일 때 (특정 메달의 개수가 같을 때)를 잘 처리해줘야 되는 문제임.
  • 따라서 반복문을 국가수만큼 돌리는데, 첫번째 국가는 비교 대상이 없으니 제외(i>0)하고, 두번째 국가부터 비교함.
  • b[1][1:] b[0][1:] 한 값이 동일하다면 pass하고
    • 왜? 특정 메달의 개수가 같다는 의미이니 등수가 동일해야됨.
  • 그게 아니라면 등수를 재설정한다. (아예 i + 1값으로 갱신함.)
  • 그러다 k를 만났다면 rank를 print하고 break.

이게.. 초등학생 문제?

alt text

This post is licensed under CC BY 4.0 by the author.