[Python/파이썬] 백준 1181 단어 정렬
📍 문제
https://www.acmicpc.net/problem/1181

📍 전체 코드
N = int(input())
num_list = []
for i in range(N):
num_list.append(input())
sorted_list = sorted(set(num_list), key=lambda x: (len(x), x))
for i in range(len(sorted_list)):
print(sorted_list[i])
📍 문제 풀이
문제에서 요구한 조건 3가지
알파벳 소문자로 이루어진 N개의 문자열을 1. 길이가 짧은 것부터 2. 길이가 같으면 사전 순으로 정렬한다.
3. 중복된 단어는 하나만 남기고 제거한다.
sorted_list = sorted(set(num_list), key=lambda x: (len(x), x))
- set() 함수를 적용하여 중복을 제거한다. (조건3)
- sorted() 함수는 기본적으로 오름차순 정렬을 수행한다. key 매개 변수를 사용하여 정렬 기준을 직접 지정한다. (조건1, 조건2)
- len(x): 문자열 길이
- x: 문자열 자체
📍 문제 해결을 위한 고민
조건이 하나인 경우 key를 사용하는 방법을 알고 있었지만,
첫번째 조건(길이)이 같은 경우 두번째 조건(사전순)을 적용하는 방법이 고민이었다.
방법을 고민하던 중 lambda 함수를 사용하여 푸는 방법을 알게 되었다.
sorted_list = sorted(set(num_list), key=lambda x: (len(x), x))
lambda 함수를 사용하여 key에 튜플 형식으로 정렬 기준을 전달했다.
key=lambda x: (len(x), x)는 각 알파벳 소문자 문자열을 (길이(len), 문자열(str)) 형태의 튜플로 변환한다.
정렬은 튜플의 첫 번째 요소(길이)를 기준으로 정렬하고, 길이가 같으면 두 번째 요소(사전순)로 정렬한다.
‼️ 주의사항
for i in range(N):
print(sorted_list[i])
set() 함수를 사용하여 중복 값을 제거하면, 리스트의 크기가 N보다 줄어든다.
반복문을 실행하면 인덱스를 초과할 수 있다.
for i in range(len(sorted_list)):
print(sorted_list[i])
따라서, 반복문의 범위를 len(sorted_list)로 수정해주었다.
⭐️ 중요 포인트 & 개념 정리
- 파이썬의 sorted() 함수나 리스트의 sort() 메서드는 기본적으로 오름차순 정렬을 수행한다.
- key 변수를 사용하면 정렬 기준을 직접 지정할 수 있다.
- key에 함수를 전달하는 경우, 이 함수는 리스트의 각 요소를 받아서 정렬 기준으로 사용할 값을 반환해야 한다.
- lambda란?
lambda는 파이썬에서 사용하는 익명함수(이름없는 함수)이다.
간단한 연산을 수행할 때 유용하다.
lambda x: (len(x), x) # 입력값 x를 받아서 (len(x), x)라는 튜플을 반환하는 함수
- len(x) → 문자열의 길이를 반환
- x → 문자열 자체를 반환
예시) 리스트 ["apple", "fig", "dog"]의 각 요소에 대해 lambda x: (len(x), x)를 적용하면 결과는 다음과 같다.
"apple" -> (5, "apple")
"fig" -> (3, "fig")
"dog" -> (3, "dog")
+ 응용하기
길이는 짧은 순, 사전순은 역순으로 정렬하려면 다음과 같이 코드를 작성하면 된다.
sorted_words = sorted(words, key=lambda x: (len(x), -ord(x[0])))