1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net


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()의 디폴트 기능인 사전 순서대로 정렬을 해주는 듯?

 

복사했습니다!