hyei-devlog

[Python/파이썬] 백준 1181 단어 정렬 본문

Online Judge/Baekjoon

[Python/파이썬] 백준 1181 단어 정렬

winter126 2025. 1. 29. 00:24

📍 문제

https://www.acmicpc.net/problem/1181

백준 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])))