문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
우선 문제를 보자마자 단어의 개수 2만개, 각 단어 길이는 최대 50
이 조건을 보고 '아 최근에 본 import sys 를 써야겠구나' 싶었고
중복은 제거한다 = list -> set -> list로 바꿔서 사용하라 라는 것을 알았다.
문제는 문자열 길이별로 정렬 + 알파벳 정렬인데...
처음에는
import sys
n = int(sys.stdin.readline())
data = [0] * 51
for i in range(n):
s = sys.stdin.readline().strip()
data[len(s)].append(s)
위의 방법으로 하려고 했다.
2022.09.29 - [Algorithm/백준] - [Python] 백준 10989번 - 수 정렬하기 3
위의 문제처럼
data = [0] * 51 로 문자열 최대 길이만큼 배열을 만들고
해당 문자열 길이에 맞는 index 위치에 입력받은 문자열을 append() 하려고 했다.
하지만 잘못된 생각이었고 난 Python의 list를 C의 포인터처럼 사용할 수는 없을까? 하고 찾아봤으나...
아직 파이썬 초보에겐 너무 어려운 방법인 것 같았다.
C언어의 위와 같은 그림을 원했는데 아직 파이썬으로 저런 걸 구현하기는 내실력으론 무리였다.
그래서 기존에 알고 있던 sort() 기능에 대해서 좀 더 알아보았다.
sort()에 key를 지정하여 어떤 방식으로 정렬을 할지 정할 수 있다는 것이다.
import sys
n = int(sys.stdin.readline())
data = []
for i in range(n):
data.append(sys.stdin.readline().strip())
set_data = set(data)
data = list(set_data)
data.sort()
data.sort(key = len)
for i in data:
print(i)
참고로
data.sort()
data.sort(key = len)
두 줄의 위치가 바뀌면 오답이다.
정답은
알파벳 정렬 -> 길이 정렬이고
반대로
길이 정렬 -> 알파벳 정렬 을 하면
but
cannot
hesitate
i
im
it
more
no
wait
wont
yours
위의 정답이 나온다.
'Algorithm > 백준' 카테고리의 다른 글
[Python] 백준 2869번 - 달팽이는 올라가고 싶다 (0) | 2022.10.12 |
---|---|
[Python] 백준 1436번 - 영화감독 숌 (1) | 2022.10.05 |
[Python] 백준 11050번 - 이항 계수 1 (0) | 2022.10.01 |
[Python] 백준 10989번 - 수 정렬하기 3 (1) | 2022.09.29 |
[Python] 백준 2231번 - 분해합 (1) | 2022.09.20 |
댓글