알고리즘/BOJ

[BOJ] 10825 - 국영수

서노리 2022. 1. 25. 17:49
반응형

https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

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]))

위 코드는 다음과 같은 규칙으로 정렬하겠다는 의미이다.

  1. 두 번째 원소를 기준으로 내림차순 정렬
  2. 두 번째 원소가 같은 경우, 세 번째 원소를 기준으로 오름차순 정렬
  3. 세 번째 원소가 같은 경우, 네 번째 원소를 기준으로 내림차순 정렬
  4. 네 번째 원소가 같은 경우, 첫 번째 원소를 기준으로 오름차순 정렬

느낀 점

이 문제를 처음 봤을 때는 일일이 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