반응형
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
예제 입력 1 복사
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
예제 출력 1 복사
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
순간 조건이 총 2개가 있음을 확인하였다.
1. 글자가 짧은 것 부터
2. 길이가 같은 것들끼리는 사전순으로
그렇기 때문에 1번 조건이 우선순위가 높아야되며,
2번 조건이 그 후에 진행이 되어야 된다는 것이다.
그리고 해당 문제는 무려 2초나 주기도 했고?
문자열은 길이는 50을 넘지 않는다고 한다.
그래서 일단 생각한 것이 글자 길이가 같은 것들끼리 리스트를 만들어야되겠다로 접근을 시작하였다.
그리고 예제에서 중복 내용이 존재하는 것을 발견하여 set()을 통해 중복을 제거해주면 되겠다 싶었다.
그리고 정렬 후 출력하면 되는 문제였다.
import sys
import copy
import math
from collections import deque
n = int(sys.stdin.readline().strip())
mp = [[] for _ in range(51)]
for _ in range(n):
wd = sys.stdin.readline().strip()
mp[len(wd)].append(wd)
for m in mp:
if(len(m)):
m = list(set(m))
m.sort()
for s in m:
print(s)
근데 사실 초기에 작성된 코드는 이것과 비슷했지만 아래와 같았다.
n = int(sys.stdin.readline().strip())
mp = [[] for _ in range(51)]
for _ in range(n):
wd = sys.stdin.readline().strip()
mp[len(wd)].append(wd)
mp[len(wd)].sort()
for m in mp:
if(len(m)):
for s in set(m):
print(s)
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
추가할 때마다 소트를 해서 시간을 초과해버린 것 같다. (아마도)
아무튼 오늘은 본가를 다녀와서 급하게 후다닥 풀었다.
반응형
'알고리즘' 카테고리의 다른 글
[BAEKJOON] 8958 OX퀴즈 (0) | 2023.11.15 |
---|---|
[BAEKJOON] 2501 약수 구하기 (0) | 2023.11.14 |
[BAEKJOON] 25305 커트라인 (0) | 2023.11.12 |
[BAEKJOON] 5086 배수와 약수 (0) | 2023.11.11 |
[BAEKJOON] 2869 달팽이는 올라가고 싶다 (0) | 2023.11.10 |