[Python/파이썬] 백준 10814 나이순 정렬
📍 문제
https://www.acmicpc.net/problem/10814
📍 전체 코드
N = int(input())
arr = []
for i in range(N):
age, name = input().split()
age = int(age)
arr.append([age, name])
arr.sort(key=lambda x: x[0])
for i in range(N):
print(arr[i][0], arr[i][1])
📍 문제 풀이
for i in range(N):
age, name = input().split()
age = int(age)
arr.append([age, name])
N번 반복하면서 나이와 이름을 입력받아 리스트에 저장한다.
split()을 사용해 입력을 공백 기준으로 나누고, 나이는 정수형(int)으로 변환한다.
[나이, 이름] 형태의 리스트를 arr에 추가한다.
arr.sort(key=lambda x: x[0])
리스트 arr을 나이 기준으로 오름차순 정렬한다.
lambda x: x[0]을 정렬 기준으로 설정하여, 각 요소(리스트)의 첫번째 값(나이)을 기준으로 정렬한다.
📍 문제 해결을 위한 고민
arr.sort(key=lambda x: x[0])
리스트를 정렬할 때, 특정 기준을 설정하기 위해 sort()의 key 매개변수를 사용했다.
이때, lambda x: x[0]은 리스트의 각 요소 x에서 첫번째 값(x[0], 나이)을 기준으로 정렬하도록 지정하는 방법이다.
익명 함수 lambda를 활용하면 간결한 코드 작성이 가능하며, key에 직접 정렬 기준을 설정할 수 있다.
만약 나이가 같으면, arr.sort(key=lambda x: x[0])에서는 기본적으로 입력된 순서대로 정렬된다.
이유는 Python의 sort() 함수가 안정 정렬(stable sort) 방식을 사용하기 때문이다. 안정 정렬은, 정렬할 때 같은 값이 있을 경우 그 값의 순서가 원래 리스트에서의 순서를 유지하도록 보장한다.
따라서 나이가 같으면 처음 입력된 순서대로 나열된다.
출력 부분의 for 반복문을 더 간결하게 줄일 수 있다.
for age, name in arr:
print(age, name)
for i in range(N) 대신 리스트 arr 자체를 순회하도록 하면, 인덱스를 사용하지 않아 코드가 더 직관적이고 가독성이 좋아진다.
위의 코드는 리스트 컴프리헨션을 사용하여 한 줄로 작성할 수 있는데 ...
* 권장되는 방법은 아니다. print()와 같은 부수효과를 일으키는 작업은 리스트 컴프리헨션에서 피하는 것이 좋다.
[print(age, name) for age, name in arr]
⭐️ 중요 포인트
리스트 정렬의 key 매개변수 활용
arr.sort(key=lambda x: x[0])를 통해 리스트의 첫 번째 요소인 age를 기준으로 리스트를 정렬한다.
key는 정렬 기준을 지정하는 매개변수로, lambda 함수를 사용하여 정렬 기준을 동적으로 설정할 수 있다.
이 방법은 복잡한 정렬 조건을 간단하게 표현할 수 있게 해준다.