백준 1181번 단어 정렬 문제입니다.
https://www.acmicpc.net/problem/1181
💡 문제 해결 아이디어
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. 정렬
제목에 있는 정렬에서 힌트를 받아 sort 와 sorted 함수를 잘 활용했습니다.
참고로 리스트.sort() 함수는 배열 자체를 정렬하는 함수이고
sorted(리스트) 함수는 받은 배열을 정렬한 것을 리턴해주는 함수입니다.
해당 문제에서 sort를 사용할 때는 key옵션을 주어 리스트.sort(key=len)을 통해 입력받은 단어 리스트를 길이 순서로 정렬 하였습니다.
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 2583번 - 영역 구하기 (파이썬) (1) | 2023.01.16 |
---|---|
[백준] 1012번 - 유기농 배추 (파이썬 Recursion Error 해결) (1) | 2023.01.15 |
[백준] 1920번 - 수 찾기 (파이썬) / 시간초과 해결 (1) | 2022.05.16 |
[백준] 1026번 - 보물 (파이썬) (1) | 2022.05.09 |
[백준] 10828번 - 스택 (파이썬) (2) | 2022.05.02 |