문제
알파벳 소문자가 n개 주어진다. n개의 소문자를 길이순으로 정렬하되 길이가 같으면 사전순으로 정렬하여 출력하시오. 단, 중복된 단어는 한 번만 출력한다.
풀이과정
백준의 solved 브론즈 문제들은 보통 정렬 기준이 하나였기 때문에 간단히 sort나 sorted로 별도 조건 없이 해결할 수 있었다. 실버 5에서부터는 정렬의 조건이 두 가지인 문제가 등장해서 정렬에 대해서 공부하고자 기록에 남기기로 했다. 본 문제는 3가지로 풀 수 있다.
1. cmp_to_key를 이용해서 정렬 기준을 커스텀해서 풀기
함수로 compare_chr(a,b)로 정렬 기준을 정의해 주고 sort(key = )에 정렬 기준을 넣어준다.
# 956ms
from functools import cmp_to_key
def compare_chr(a, b) :
if len(a) > len(b) :
return 1
elif len(a) == len(b) :
if a > b :
return 1
elif a == b :
return 0
else :
return -1
else :
return -1
n = int(input())
res = set()
for _ in range(n) :
res.add(input())
for item in sorted(res, key = cmp_to_key(compare_chr)) :
print(item)
2. 커스텀 없이 sort()만 이용한 방법
사전적으로 우선 정렬한 뒤 길이순으로 정렬해준다.
# 1080ms
n = int(input())
res = set()
for _ in range(n) :
res.add(input())
res = list(res)
res.sort() # 사전적 정렬
res.sort(key = len) # 길이순
for item in res :
print(item)
3. lambda식를 이용해 정렬
lambda식을 이용해서 정렬 기준을 길이순 - 사전순으로 정해준다. 이 방법이 실행 시간이 860ms로 가장 빨랐다. 실행 시간은 input을 sys.stdin.readline으로 대체하면 더 빨라진다.
# 860ms
n = int(input())
res = set()
for _ in range(n) :
res.add(input())
res = list(res)
res.sort(key= lambda x : (len(x), x))
for item in res :
print(item)
'코딩테스트' 카테고리의 다른 글
[코딩테스트][파이썬] 재귀함수 깊이제한 setrecursionlimit (0) | 2022.11.14 |
---|---|
[코딩테스트][파이썬] 소수 구하기 (0) | 2022.09.29 |
[파이썬] 팩토리얼 !, 계승 (0) | 2022.08.29 |
[파이썬] 최대공약수와 최소공배수 (0) | 2022.08.27 |