파이썬의 정렬을 도와주는 함수sorted()와 리스트 등에서 사용할 수 있는 메서드 sort()가 있습니다.
처음 사용할 때 가장 많이 햇갈렸었는데 한 줄로 설명하면 다음과 같습니다.
1. sort는 반환 값이 없다
2. sorted는 반환 값이 있다.
이 말을 소스코드로 보면
lst = [1,3,2,4,7,5]
lst = sorted(lst) # 정렬된 값이 lst에 저장된다
lst = lst.sort() # None
lst.sort() # lst가 정렬됨
sort(*, key=None, reverse=False)
key : 기준으로 설정할 파라미터를 함수 형태로 지정한다, 주로 lambda를 이용하며, len 과 같은 내장 함수도 사용 가능하다.
reverse : 부울값이며, 오름차순 또는 내림차순을 지정한다.
sort() 메서드는 안정적임이 보장됩니다. 정렬은 같다고 비교되는 요소들의 상대적 순서를 변경하지 않으면 안정적입니다 — 이는 여러 번 정렬하는 데 유용합니다 (예를 들어, 부서별로 정렬한 후에 급여 등급으로 정렬).
sorted(iterable, /, *, key=None, reverse=False)
파라미터 key와 reverse는 sort()와 동일하게 동작합니다.
기본적으로 sort와 sorted의 사용법을 알고 있다고 가정하고, 정렬할 조건이 여러개인 경우 어떻게 해야 하는지 정리해보겠습니다.
조건이 무려 4가지나 됩니다.
1. 국어 점수가 감소하는 순서로
2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
lst = []
for i in range(int(input())):
lst.append(list(input().split()))
입력을 받을때 모두 문자열로 받았으므로, 비교를 할때는 정수형으로 바꿔 비교를 해줍니다.
리스트의 형태는 아래와 같습니다.
[['Junkyu', '50', '60', '100'],
['Sangkeun', '80', '60', '50'],
['Sunyoung', '80', '70', '100'],
.
.
.
['Soong', '50', '60', '90']]
여기서 조건을 줄여 1번과 2번 조건만 있다고 가정해봅시다.
lst.sort(key = lambda x:(-int(x[1]), int(x[2]))
이때 key 값은 튜플 형태로 넣어주면 되며, 내림차순의 경우 앞에 를 붙여주면 된다.
즉 아래와 같은 방식으로 key값을 주면 된다
lst.sort(key = lambda x: (조건1, 조건2, ... ,조건 n))
이를 이용하여 문제를 풀이하면 전체 소스코드는 아래와 같아지게 된다.
import sys
input = sys.stdin.readline
lst = []
for i in range(int(input())):
lst.append(list(input().split()))
lst.sort(key = lambda x:(-int(x[1]), int(x[2]), -int(x[3]), x[0]))
for i in lst:
print(i[0])