본문 바로가기

알고리즘/백준

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

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

 

1181번: 단어 정렬

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

www.acmicpc.net

  1. 중복 단어 제거
  2. 길이 순 정렬 후 사전 순 정렬

이 두가지 과정으로 진행하면 됩니다.

import sys
n = int(input())
word_list = []
for _ in range(n):
  word = sys.stdin.readline().strip()
  word_len = len(word)
  if [word_len, word] not in word_list:
    word_list.append([word_len, word])

word_list.sort(key = lambda x : (x[0], x[1]))
for i in word_list:
  print(i[1])

입력받은 단어와 단어의 길이를 리스트에 [길이, 단어] 형식으로 추가해줍니다.

sort(key = lambda) 를 이용해 길이 순으로 먼저 정렬 후 단어 사전 순으로 정렬 진행해줬습니다.

 

근데 이렇게 진행하면 정답이라고 나오긴 하는데 시간이 너무 오래걸려서

중복치 제거하는 방법중에 집합(set)을 활용하는 방법이 있기 때문에 그걸 이용해서 다시 한 번 풀었습니다.

import sys
read = sys.stdin.readline
n = int(read())
word_set = set()
for _ in range(n):
    word_set.add(read().strip())
list = list(word_set)
list.sort(key=lambda x : (len(x), x))
for i in range(len(list)):
    print(list[i])

처음엔 중복치가 들어가지 않게 word_set에 추가해주고

정렬을 해야하니까 다시 list로 바꿔서 정렬 했습니다.