자료구조 및 알고리즘/백준

[python] 1181. 단어 정렬

viamemine 2023. 1. 18. 12:47
728x90
반응형
  • 문제



  • 올바른 풀이 1
N = int(input())
str_list = []
answer_list = []
for i in range(N):
    string = str(input()) # sys.stdin.readline()
    str_list.append(string)
str_list = sorted(str_list)
str_list = sorted(str_list, key=len)

for i in str_list:
    if i in answer_list: # 겹치지 않도록 안에 있으면 continue
        continue
    else: # 없으면 추가
        answer_list.append(i)

print(*answer_list, sep='\n')

 

해당 문제는 단순 정렬을 하는 것이 아니라, 길이가 짧은 것부터 정렬하고

길이가 같으면 사전 순으로 정렬하는 문제이다.

 

처음에 생각한 로직은 정렬을 해서 사전 순으로 만든 다음, 버블 정렬처럼 길이가 긴 원소들을

뒤로 보내주는 방법으로 코드를 작성하고자 했다. 

 

하지만 sort할 때, key=len으로 길이가 짧은 순서대로 정렬을 할 수 있었기 때문에 이중 for문을 사용하지 않았다.

 

위에 방법은 주어진 리스트를 먼저 정렬하고 → 길이가 짧은 것부터 정렬한다음,

새로운 answer_list를 통해 중복된 단어들을 제거해주는 방법으로 작성한 코드이다.

 

 

  • 올바른 풀이 2 (더 간결한 코드)
N = int(input())
str_list = []

for i in range(N):
    string = str(input()) # sys.stdin.readline()
    str_list.append(string)
str_list = sorted(set(str_list))
str_list = sorted(str_list, key=len)

print(*str_list, sep='\n')

 

하지만 더 간단한 방법을 생각했다.

list를 set으로 만들어주어 중복을 제거한 다음, 정렬을 하면 새로운 리스트를 쓰지 않아도 된다.

 

때문에 처음 리스트를 set으로 중복을 제거해주고 정렬하고, 그 다음 key=len으로 길이대로 정렬해주는 방법으로 코드를 작성했다. 

 

한 가지 더 언급할 것이 있다면 for문 안에서 입력 값을 받아야 하기 때문에

처음에는 import sys, sys.stdin.readline()을 작성했는데 

프린트해보면 단어끝에 \n이 붙어서 리스트에 저장되어, str(input())으로 받아 저장했다.

아마 readline()이라서 그런 것 같다. 

 

  • 올바른 풀이 3 (시간 단축 !)
import sys
N = int(input())
str_list = []
answer_list = []
for i in range(N):
    string = str(sys.stdin.readline().strip())
    str_list.append(string)
str_list = sorted(set(str_list))
str_list = sorted(str_list, key=len)

print(*str_list, sep='\n')

 

input()보다 readline()으로 받는 것이 시간을 더 단축할 수 있기 때문에 해당 코드도 작성해본다면, 다음과 같다.

아래의 표를 보면 시간을 훨씬 단축한 것을 볼 수 있다 ! 

 

 

728x90