[파이썬] 백준 #1181 단어 정렬

Seori·2022년 8월 7일
0

백준

목록 보기
3/8

알고리즘 문제를 계속 풀면서 가장 재밌는 점은 이전에 배운 개념을 적용해서 코드를 만들어낼 수 있을 때 느껴지는 것 같다. 이번에는 #1931번에서 배운 lambda함수 정렬법과 list comprehension을 활용하여 해결할 수 있었다.


문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

입력

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours

출력

조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.

i
im
it
no
but
more
wait
wont
yours
cannot
hesitate

풀이 과정

1. 입력 값 받기

N = int(input())
words = {input() for i in range(N)}

단어의 총 횟수 N을 int형으로 받아 저장하였고,
N개만큼 주어지는 단어들을 저장하기 위해 words라는 set를 만들었다.
이번 문제에서는 중복을 제거해야했기 때문에 평소대로 list가 아니라, 중복 제거 기능이 있는 set를 사용하였다.

input() for i in range(N)는 list comprehension을 활용한 문장으로, 쉽고 간단한 파이썬 문법 특성상 아래 3줄을 1줄로 줄일 수 있었다.

words = set()
for i in range(N):
	words.add(input())

2. 리스트 순서 정렬하기

words_list = list(words)
words_list.sort(key = lambda x : (len(x), x))

set은 중복도 없지만, 원소의 순서도 상관이 없는 묶음이다. 따라서 정렬과 인덱싱이 불가능하기 때문에 set인 words를 list형인 words_list로 바꿔주었다.

정렬은 1931번 때와 마찬가지로 lambda 함수를 활용하여 길이순, 사전순으로 2번 정렬하였다.

3. 값 출력하기

for word in words_list:
  print(word)

정렬된 words_list의 원소를 순서대로 출력하면 문제의 답이 된다.

- 답안

N = int(input())
words = {input() for i in range(N)}

words_list = list(words)
words_list.sort(key = lambda x : (len(x), x))
for word in words_list:
 print(word)

*모든 문제의 저작권은 백준 온라인 저지(https://www.acmicpc.net/) 원작자에게 있습니다.
백준 1181번(https://www.acmicpc.net/problem/1181)

profile
뭐든 만들고 싶은 개미 개발자

0개의 댓글