조금씩 꾸준히 완성을 향해

[Algorithm] 백준 1181 단어 정렬 with Python 본문

DataStructure & Algorithm/문제풀이

[Algorithm] 백준 1181 단어 정렬 with Python

all_sound 2022. 10. 6. 14:21

문제

알파벳 소문자로 이루어진 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

내가 짠 코드

n = int(input())
li = []
for i in range(n):
    s = input()  #문자받기
    t = (len(s), s)  #문자의 길이와 문자를 튜플로 묶기
    if t not in li:  #튜플을 리스트에 삽입
        li.append(t)
li.sort()  #리스트 오름차순 정렬
for i in li:  # 리스트 -> 튜플 -> 문자 선택해 출력
    print(i[1])

잠깐 생각하다 짰는데 내가 생각해도 짧고 기발해서 놀랐다!!

바로 전에 정렬 문제를 두 개 풀었는데, 그때 썼던 튜플 자료형의 잔상이 남아 있어서 쉽게 가능했던 것 같다. 

문자열의 길이로 먼저 정렬하고, 그 후 알파벳 순으로 정렬하는 게 조건이었는데, 튜플에 넣으니 한 번에 해결이 됐다. 

결과에 같은 단어가 여러번 들어가면 안되기 때문에 튜플이 리스트에 들어 있지 않는 경우에만 추가하는 조건문을 넣었다.

출력은 튜플의 두번째 값, 즉 알파벳 단어값만 인덱싱해서 구현했다. 

 

 

 

https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

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

www.acmicpc.net