Solved.ac - Python/CLASS 2
[파이썬/Python] 백준 1181번 단어 정렬
ImJay
2023. 4. 14. 20:53
반응형
[파이썬/Python] 백준 1181번 단어 정렬
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
해설
사전 순으로 정렬하고, 길이가 짧은 순으로 정렬하게 되면 사전 순으로 정렬한 의미가 사라진다.
따라서, 사전 순으로 정렬부터 한 다음에 길이 순으로 정렬해야한다.
코드
import sys
words = []
for _ in range(int(sys.stdin.readline().strip())):
words.append(sys.stdin.readline().strip())
words = list(set(words)) # 중복 제거
words.sort() # 사전 순으로
words.sort(key = len) # 길이가 짧은 것부터
for word in words:
print(word)
풀이
import sys
words = []
for _ in range(int(sys.stdin.readline().strip())):
words.append(sys.stdin.readline().strip())
1. N 을 입력 받고, 반복하여 리스트에 단어를 넣는다.
words = list(set(words)) # 중복 제거
2. 파이썬에서 집합은 중복된 내용을 하나로 취급하기 때문에 사라진다.
따라서, 입력받은 리스트를 집합으로 바꾼 다음에 다시 리스트로 바꿔준다.
words.sort() # 사전 순으로
words.sort(key = len) # 길이가 짧은 것부터
3. sort 메소드를 통해 사전 순으로 정렬하고, sort 메소드의 파라미터를 len으로 받아 길이 순으로 다시 정렬한다.
for word in words:
print(word)
4. 출력
피드백
1. 처음에 풀 때 sort 생각 못하고 ( 왜 자꾸 못떠올리지 ) bubble, merge sort 문제인줄 알았다.
2. 풀고 나서 굳이 리스트로 받아서, 집합으로 변환 후 다시 리스트로 변환하는게 비효율적으로 보여서
import sys
words = set()
for _ in range(int(sys.stdin.readline().strip())):
words.add(sys.stdin.readline().strip())
words = list(words)
words.sort() # 단어 순 정렬
words.sort(key = len) # 길이가 짧은 것부터
for word in words:
print(word)
처음부터 집합으로 받아보았다.

??? 집합으로 입력 받는 것 자체가 실행 시간에 무리가 가는 듯 하다. (add method?)

반응형