import sys
n = int(input())
word = [sys.stdin.readline().strip() for _ in range(n)]
word = list(set(word))
word.sort(key=len)
length = 1
tmp, result = [], []
for w in word:
if len(w) != length:
length = len(w)
tmp.sort()
result += tmp
tmp = [w]
else:
tmp.append(w)
tmp.sort()
result += tmp
for word in result: print(word)
단어를 정렬하는데 첫 번째 기준은 문자열의 길이, 두 번째 기준은 사전 순서대로인 문제였다.
먼저 sys.stdin.readline()은 개행문자를 포함하기 때문에 strip()으로 개행문자를 제거했다.
그리고 중복된 문자열을 허용하지 않기 때문에 set을 해주었고, sort(key=len)을 이용하여 첫 번째 기준인 길이로 정렬을 하였다.
참고로 sort() 함수를 이용하여 정렬을 하면 사전 순서에 따라 정렬을 해주고, sort(key=len)을 이용하면 문자열의 길이에 따라 정렬을 해준다.
여기서 sort의 key 는 함수를 값으로 받는 파라미터이다. (len은 파이썬의 내장 함수)
타입이 int인 경우에는 길이를 정의할 수 없기 때문에 에러가 난다.
길이를 기준으로 정렬을 한 뒤 사전 순서대로 어떻게 정렬을 할까 하다가 길이가 똑같을 때의 문자열들을 리스트로 모아서 사전 순서대로 정렬을 한 뒤 새로운 리스트를 만들어 거기에 저장을 하는 식으로 구현을 했다.
근데 알고보니 아주 쉽게 구현이 가능했는다.
일단 첫 번째 방법은 그냥 sort()함수를 이용해서 사전 순서대로 정렬한 다음에 key=len을 주어서 정렬하는 방법이다.
import sys
n = int(input())
word = [sys.stdin.readline().strip() for _ in range(n)]
word = list(set(word))
word.sort()
word.sort(key=len)
for w in word: print(w)
두 번째 방법은 람다 함수를 사용하는 방법이다.
import sys
n = int(input())
word = [sys.stdin.readline().strip() for _ in range(n)]
word = list(set(word))
word.sort(key = lambda x: (len(x), x))
for w in word: print(w)
일단 첫 번째 인자가 len(x)니까 길이대로 정렬을 하고, 그 후에 두 번째 인자는 x니까 그냥 사전 순서대로 정렬을 한다.
사실 검색을 해도 잘 안나와서 확신은 안드는데 x만 저렇게 인자로 주면 그냥 sort()의 기능과 같다고 보면 되는 것 같다. 그래서 sort()의 디폴트 기능인 사전 순서대로 정렬을 해주는 듯?
'알고리즘' 카테고리의 다른 글
[백준] 1003 피보나치 함수 - 파이썬 (0) | 2022.04.21 |
---|---|
[백준] 18870 좌표 압축 - 파이썬 (0) | 2022.04.11 |
[백준] 11650 좌표 정렬하기 - 파이썬 (0) | 2022.04.07 |
[백준] 2018 통계학 - 파이썬 (0) | 2022.04.06 |
[백준] 10989 수 정렬하기 3 - 파이썬 (카운팅 정렬) (0) | 2022.04.05 |