jyamethyst21 님의 블로그
백준 1181번- '단어 정렬' (PYTHON 풀이) 본문
문제:

사용자로부터 입력 개수를 받은 뒤 그 수만큼 소문자 단어를 받는데, 이를 글자 수 기준으로 정렬하고, 같은 경우 사전 기준대로 순서대로 놓고 전부 출력하면 되는 문제이다.
풀이:
N = int(input())
li = []
for i in range(N):
k = input()
li.append(k)
for j in range(i):
if len(li[i]) < len(li[j]) or len(li[i]) == len(li[j]) and li[i] < li[j]:
li[i], li[j] = li[j], li[i]
print(li)
처음에는 이렇게 풀었다. 조금 복잡하긴 하지만 비쥬얼스튜디오코드에서 실행했을 때 이상 없이 잘 되어서 제출했는데 역시나 시간초과가 떴다.
아무래도 이 코드는 최대 O(n^2)에 해당하는 시간 복잡도를 가지고 있기 때문에 큰 수를 입력 받게 될 경우 엄청나게 오래 걸리게 될 것이다. 최근에 파이썬 내장 함수를 활용해서 많이 풀었어서 이번엔 내장 함수 활용을 하지 않고 풀려고 하다 보니 길어졌는데 시간 초과가 나오니 어떻게 풀어야할지 감이 안왔다.
N = int(input())
li = []
for i in range(N):
k = input()
li.append(k)
li.sort()
li.sort(key=len)
print("\n".join(li))
그래서 결국 내장 함수를 활용하기로 했는데, 서치하다가 sort의 key를 정해서 이를 기준으로 정렬할 수 있는 것을 발견하였다.
그래서 위와 같이 풀었는데 틀렸다고 나와서 문제를 다시 읽어보았다.
문제에서는 '단, 중복된 단어는 하나만 남기고 제거해야 한다.'는 내용이 있었다. 내 코드는 중복된 단어를 제거하는 코드가 없어서 틀린 것 같았다. 그래서 이를 추가하였다.
최종 코드:
N = int(input())
li = []
for i in range(N):
k = input()
li.append(k)
li = list(set(li))
li.sort()
li.sort(key=len)
print("\n".join(li))
이렇게 푸니 정답이라고 나왔다.
set 함수를 활용해서 중복을 제거하고 이를 알파벳 순서대로 sort로 정렬한 뒤에, 앞서 말한 key를 활용해서 1차로 알파벳 순서 정렬된 리스트를 길이로 또 한번 조건을 걸어 정렬해준다. 마지막으로는 출력 결과와 동일하게 하기 위해 join 함수를 통해 띄어쓰기로 출력하게 만든다.
.
.
역시 파이썬은 간단하다 ..^^
'CODING 💻' 카테고리의 다른 글
| 백준 24313번- '알고리즘 수업 - 점근적 표기 1' (PYTHON 풀이) (0) | 2025.10.04 |
|---|---|
| 백준 10872번- '팩토리얼' (PYTHON 풀이) (0) | 2025.10.03 |
| 백준 1427번- '소트인사이드' (PYTHON 풀이) (0) | 2025.10.01 |
| 백준 2751번- '수 정렬하기 2' (PYTHON 풀이) (0) | 2025.09.30 |
| 백준 10989번- '수 정렬하기 3' (PYTHON 풀이) (0) | 2025.09.29 |
