국영수 (정렬) - 백준 10825번

‘풀이시간 20분 , 시간제한 1초, 메모리제한 256MB, 백준 10825번’


국영수 - 백준 10825번


이 문제는 파이썬의 튜플을 이용하면 쉽게 해결이 가능하다. 처음에 파이썬 튜플의 정렬 규칙을 몰라서 엄청 헤맸는데 이를 알고 나서 이러한 유형의 문제가 많고 많이 쓰는 방법이란걸 알게 되었다.

예를 들면 이런 튜플이 있다고 가정한다.

a = [(5,1,5),(3,5,5),(3,1,9),(3,1,1)]
a.sort # 정렬

print(a)

출력결과

[(3, 1, 1), (3, 1, 9), (3, 5, 5), (5, 1, 5)]


파이썬 튜플은 sort()를 이용하면 튜플의 첫번째 원소 기준으로 정렬이 된다. 그러나 첫번째 원소가 서로 같은 경우 두번째 원소를 기준으로 정렬되고, 두번째 원소 또한 같은 경우 세번째 원소를 기준으로 정렬한다.
중요한 점은 이 규칙을 람다 함수를 이용하면 변경할 수 있다는 점이다.

students.sort(key = lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))

위의 람다 함수의 의미는 정렬을 하되 key값 x에서 두번째요소를 내림차순으로 우선 정렬하고, 만약 같은값이 나오면 세번째 요소를 기준으로 정렬, 세번째 요소 또한 같으면 네번째 요소를 내림차순으로 정렬하고 이 또한 같으면 첫번째 요소를 오름차순으로 하여 정렬하라는 의미이다.

람다함수와 튜플 정렬을 이용한 방법👍

from sys import stdin

n = int(input())

students = [] # 학생 정보를 담을 리스트

# 모든 학생의 정보를 튜플로 입력받기
for _ in range(n):
  students.append(stdin.readline().rstrip().split())

students.sort(key = lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))
# 두번째 요소 즉 국어 성적은 내림차순, 국어가 같으면 세번째 요소인 영어를 오름차순, 영어도 같으면 수학을 내림차순으로, 수학 또한 같으면 이름을 오름차순으로 구현한 것이다.

#정렬된 학생 정보에서 이름 출력
for student in students:
  print(student[0])