문제 개요
선수들의 정보를 담고 있는 2차원 리스트가 있다고 가정해 보겠습니다. 각 행은 한 명의 선수에 대한 정보를 나타내며, 순위(Rank), 나이(Age), 키(Height) 세 가지 속성으로 구성되어 있습니다. 여기에 추가로 숫자 k가 주어졌을 때, k번째 속성을 기준으로 전체 데이터를 정렬해야 합니다.
예를 들어 입력이 다음과 같다고 해보겠습니다.
| 순위 | 나이 | 키 |
|---|---|---|
| 1 | 25 | 190 |
| 2 | 35 | 180 |
| 3 | 33 | 185 |
| 4 | 26 | 175 |
| 5 | 35 | 180 |
이때 k = 1, 즉 두 번째 속성인 '나이'를 기준으로 오름차순 정렬하면 결과는 다음과 같습니다.
| 순위 | 나이 | 키 |
|---|---|---|
| 1 | 25 | 190 |
| 4 | 26 | 175 |
| 3 | 33 | 185 |
| 2 | 35 | 180 |
| 5 | 35 | 180 |
[[1, 25, 190], [4, 26, 175], [3, 33, 185], [2, 35, 180], [5, 35, 180]]
나이가 같은 경우(예: 35세인 2번과 5번 선수)에는 원래 리스트의 순서가 유지되는데, 이는 파이썬의 정렬이 안정 정렬(stable sort)이기 때문입니다.
해결 접근 방법
이 문제는 다음 두 단계만으로 간단히 해결할 수 있습니다.
info라는 이름의 2차원 리스트에 리스트의 내장 메서드인sort()함수를 호출합니다.k번째 요소를 반환하는 람다(lambda) 함수를 정의하고, 이를
sort()함수의 key 매개변수에 전달합니다.
파이썬의 sort() 메서드는 key 인자로 전달된 함수의 반환값을 기준으로 요소를 비교합니다. 따라서 lambda x: x[k]처럼 각 행(row)에서 k번째 열(column)의 값을 꺼내도록 지정하면, 해당 속성을 기준으로 정렬이 수행됩니다.
구현 예제
아래 코드를 통해 실제 동작을 확인해 보겠습니다.
def solve(info, k):
info.sort(key=lambda x: x[k])
return info
info = [[1, 25, 190], [2, 35, 180], [3, 33, 185], [4, 26, 175], [5, 35, 180]]
k = 1
print(solve(info, k))입력
[[1, 25, 190], [2, 35, 180], [3, 33, 185], [4, 26, 175], [5, 35, 180]], 1
출력
[[1, 25, 190], [4, 26, 175], [3, 33, 185], [2, 35, 180], [5, 35, 180]]
추가 팁
내림차순 정렬이 필요하다면
info.sort(key=lambda x: x[k], reverse=True)처럼reverse=True옵션을 사용하면 됩니다.원본 리스트를 유지한 채 새롭게 정렬된 리스트를 얻고 싶다면
sorted(info, key=lambda x: x[k])함수를 사용하는 것이 좋습니다.여러 조건으로 정렬해야 하는 경우에는
key=lambda x: (x[1], x[2])형태로 튜플을 반환하면 첫 번째 기준이 같을 때 두 번째 기준으로 정렬됩니다.