[백준] 1181번 - 단어 정렬

백준 1181번 단어 정렬 문제입니다.

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

 

1181번: 단어 정렬

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

www.acmicpc.net

 

💡 문제 해결 아이디어

 

1181번 문제는 n개의 문자열을 입력받아

길이 순서대로 오름차순 정렬 후, 같은 길이의 문자열는 문자열 알파벳 순서대로 오름차순 정렬한 결과를 출력하는 문제입니다.

 

1.

이 문제는 같은 데이터를 받으면 안 되기 때문에 set으로 데이터를 입력받은 후

정렬을 위해 list로 변환시켜 word_list에 저장하고,

오름차순으로 정렬시켜 가장 마지막에 있는 문자열의 길이를

max_cnt에 저장.

 

2.

같은 길이의 문자열을 배열에 입력받아 정렬하여 출력시킬 수 있도록

 

result = []

작성

 

3.

입력받는 최소 문자열 길이 1 부터 max_cnt 까지 확인할 수 있도록 반복문

 

for i in range(1,max_cnt+1):

작성

 

4.

3에서 작성한 for문 내부에

문자열 리스트 중 문자열의 길이가 i인 데이터를 찾아 result에 저정하기 위해

 

for j in word_list:

if(len(j) == i):

result.append(j)

작성

 

5.

4에서 작성한 for문 다음에

글자수가 i인 데이터를 담은 result를 알파벳 순서대로 정렬하여 순서대로 출력해주고

다음에 들어올 글자수가 i+1인 문자열을 입력받으려면 result를 비워야하기 때문에

 

for w in sorted(result):

print(w)

result.clear()

작성

 

import sys
input = sys.stdin.readline

n = int(input().rstrip())   # n입력받기
word_list = list(set(input().rstrip()
                 for _ in range(n)))   # set으로 입력받아 중복단어 제거 후 list로 저장
word_list.sort(key=len)  # 길이 순서로 정렬
max_cnt = len(word_list[-1])    # 제일 긴 단어 길이 저장

result = []
for i in range(1, max_cnt+1):   # 1~max단어길이(i) for문
    for j in word_list:
        if(len(j) == i):    # 리스트에서 단어 길이가 i인 데이터 찾아서 result에 저장
            result.append(j)
    for w in sorted(result):    # 단어길이가 i인 데이터가 저장된 result를 sorted로 정렬 후 출력
        print(w)
    result.clear()  # 길이가 i+1인 데이터를 저장하여 정렬하기 위해 길이가 i인 데이터 삭제

 


💡 주요 함수

 

1. set

문제는 같은 단어를 받으면 생략하도록 처리하라고 지시합니다.

set 을 사용하여 데이터를 받으면 같은 데이터를 스스로 제거해주기 때문에 편리합니다.

 

하지만!

set순서가 없는 리스트이기 때문에 다음으로 적용할 정렬을 위해 list()로 묶어주었습니다.

 

 

2. 정렬

제목에 있는 정렬에서 힌트를 받아 sortsorted 함수를 잘 활용했습니다.

 

참고로 리스트.sort() 함수는 배열 자체를 정렬하는 함수이고

sorted(리스트) 함수는 받은 배열을 정렬한 것을 리턴해주는 함수입니다.

 

해당 문제에서 sort를 사용할 때는 key옵션을 주어 리스트.sort(key=len)을 통해 입력받은 단어 리스트를 길이 순서로 정렬 하였습니다.