반응형
https://www.acmicpc.net/problem/10825
import sys
n = int(sys.stdin.readline())
data = []
for i in range(n):
temp = list(sys.stdin.readline().rstrip().split())
data.append((temp[0], int(temp[1]), int(temp[2]), int(temp[3])))
data.sort(key = lambda x: (-(int(x[1])), int(x[2]), -(int(x[3])), x[0]))
for i in data:
print(i[0])
먼저 한 사람의 데이터를 list로 입력받은 후 각 원소를 튜플로 묶어 관리하면 편하다.
튜플을 원소로 하는 리스트가 있을 때, 그 리스트를 정렬하면 첫 번째 원소의 순서에 맞게 정렬되고, 첫 번째 원소의 값이 같은 경우 두 번째 원소의 순서에 맞게 정렬되는 속성을 가지고 있다. 이 문제에서는 이러한 기본 규칙이 아닌 다른 규칙대로 정렬해야 하므로 sort() 함수의 key 속성을 이용하여 내가 원하는 정렬 기준을 만들어주어야 한다.
data.sort(key = lambda x: (-(int(x[1])), int(x[2]), -(int(x[3])), x[0]))
위 코드는 다음과 같은 규칙으로 정렬하겠다는 의미이다.
- 두 번째 원소를 기준으로 내림차순 정렬
- 두 번째 원소가 같은 경우, 세 번째 원소를 기준으로 오름차순 정렬
- 세 번째 원소가 같은 경우, 네 번째 원소를 기준으로 내림차순 정렬
- 네 번째 원소가 같은 경우, 첫 번째 원소를 기준으로 오름차순 정렬
느낀 점
이 문제를 처음 봤을 때는 일일이 if 문으로 케이스를 나누면서 구현해야 하는 굉장히 귀찮은 문제라고 생각했다.
실제로 다른 언어로 구현할 경우에는 그런 문제가 맞을 수 도 있지만 적어도 파이썬에서 만큼은 아니었다.
key 속성에서 위와 같이 여러 개의 정렬 기준을 설정할 수 있다는 것을 배웠고, 또한 마이너스(-) 기호를 이용하면 역순 정렬을 이용할 수 있다는 점을 기억해야겠다.
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 2108 - 통계학 (0) | 2022.01.28 |
---|---|
[BOJ] 1715 - 카드 정렬하기 (0) | 2022.01.26 |
[BOJ] 18405 - 경쟁적 전염 (0) | 2022.01.22 |
[BOJ] 14502 - 연구소 (0) | 2022.01.19 |
[BOJ] 2667 - 단지번호붙이기 (0) | 2022.01.16 |