오늘의 문제
https://www.acmicpc.net/problem/1181
포인트 쳌쳌
- 두가지 정렬 조건을 만족시켜야 하는데 sorted()를 통해 해결가능한 간단한 문제이다.
- sorted에서 정렬조건은
key
속성에 lambda 식으로 작성한다. - 중복단어는 한번만 출력되도록
set
으로 변환해줌으로써 중복을 제거해준다.
lambda식을 이용한 정렬 다중 조건
sort(), sorted와 같은 정렬 함수는 key매개변수를 통해 세부 정렬 조건을 등록한다. 이때 단순히 str.lower처럼 단일 인자를 사용할 수도 있지만
- 딕셔너리의 키 값을 기준으로
- 튜플의 특정 인덱스위치의 값을 기준으로
와 같이 좀 더 복잡한 객체 정렬을 수행하고자 할 때 lambda를 활용할 수 있다.
아래 코드와 더불어 설명하자면
나는 문제의 의도대로 길이가 짧은 순서대로 오름차순(첫번째 정렬 조건)을 한 뒤, 문자열 사전 순(두번째 정렬 조건)으로 한번에 정렬하고 싶었다.
따라서 lambda x:(len(x), x.lower())
와 같이 표현식 부분을 괄호로 묶어서 적용시켜주었다.
괄호없이 key = lambda x:len(x), x.lower()
이렇게 써버리면
key매개변수에 대한 값이 반점으로 인해 중간에 끊기게 되므로 positional error 가 발생한다.
다음은 채점 결과 코드이다.
풀이 코드
import sys
n = int(input())
words = []
for i in range(n):
word = sys.stdin.readline()
words.append(word)
#중복 단어 제거
words = list(set(words))
#다중 조건 정렬 - lambda이용
result = sorted(words, key = lambda x:(len(x), x.lower()))
for i in range(len(result)):
sys.stdout.write('{}'.format(result[i]))