백준 1181번 : 단어 정렬 문제풀이 [파이썬]
<문제>
1181번 문제의 내용은 아래와 같습니다.
단어 정렬
문제
알파벳 소문자로 이루어진 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
<작성한 코드>
#단어 정렬
N = int(input())
words = []
for _ in range(N):
words.append(input())
#중복 제거 set사용하면 집합 자료형으로 {}로 묶임
words = list(set(words))
words.sort()
words.sort(key = len)
for i in words:
print(i)
<코드 풀이>
본 문제에는 총 3개의 조건이 있다.
1. 길이가 짧은 것부터 정렬
2. 길이가 같다면 사전순으로 정렬
3. 중복된 단어는 하나만 남기기
N = int(input())
words = []
for _ in range(N):
words.append(input())
우선 입력값들을 전부 list에 넣어주기 위해서
문제의 조건에 맞춰 위와 같이 코드를 작성해주었다.
일단 내가 만족시키려고했던 조건은 '중복된 단어 제거' 부분이다.
정렬하기 전에 중복되는 단어들을 제거하는게 아무래도 좋을 것 같았다.
중복을 제거하기 위해서는 set() 함수를 사용해주었다.
words = list(set(words))
이때 set()함수를 사용하면, 집합 자료형으로 원소들이 {}로 묶이게 되는데,
우리는 이후에 정렬을 할때 리스트 정렬 함수인 sort()를 사용할 것이기 때문에 list()로 감싸주었다.
words.sort()
words.sort(key = len)
다음으로 길이가 같다면 사전순으로 정렬하고, 길이가 짧은것부터 정렬해야하는데
가장 먼저 words.sort()를 사용해 사전순으로 문자열들을 정렬해주었다.
길이순으로 정렬한 이후에 sort()를 사용해 다시 정렬하게되면 선결조건인 길이순 정렬이 어긋날 수 있기 때문이다.
길이순으로 정렬하기 위해서 words.sort(key = len)을 사용했다.
정렬의 기준을 len, 문자열의 길이로 하기 위함이다.
for i in words:
print(i)
문제에서 주어진 출력 예제대로 출력하기 위해서
위와 같이 코드를 작성해주었다.
'백준 알고리즘' 카테고리의 다른 글
백준 18870번 좌표 압축 문제풀이, 파이썬 (0) | 2023.03.06 |
---|---|
백준 10814번 나이순 정렬 문제풀이, 파이썬 (0) | 2023.03.06 |
백준 11651번 좌표 정렬하기2 문제풀이, 파이썬 (0) | 2023.03.05 |
백준 11650번 좌표 정렬하기 문제풀이, 파이썬 (0) | 2023.03.05 |
백준 1427번 소트인사이드 문제풀이, 파이썬 (0) | 2023.03.05 |