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
'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글
[python] 1427. 소트인사이드 (0) | 2023.01.18 |
---|---|
[python] 2751. 수 정렬하기 2 (0) | 2023.01.18 |
[python] 2108. 통계학 (0) | 2023.01.16 |
[python] 11728. 배열 합치기 (0) | 2023.01.16 |
[python] 9020. 골드바흐의 추측 (0) | 2023.01.14 |