백준(BOJ) 문제 풀이

백준 1181번 문제(단어 정렬) 파이썬(Python) 풀이 [로밍맨]

로밍맨 2021. 7. 2. 22:48
728x90
반응형

문제 링크

www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

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

www.acmicpc.net

 

정답 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/python3
 
= 51
 
def solve():
  n = int(input())
  arr = [set() for _ in range(N)]
  for _ in range(n):
    a = input()
    arr[len(a)].add(a)
  for i in range(N):
    for item in sorted(arr[i]):
      print(item)
 
solve()
 
cs

 

문자열을 정렬하는 문제인데, 몇 가지 자잘한 조건들이 추가로 붙었습니다.

하나는 중복을 제거하는 것이고, 또 하나는 길이도 고려하는 정렬이라는 것입니다.

저는 중복을 제거하기 위해 set 을 이용하였고, 길이에 따라 정렬하기 위해 최대 길이만큼의 list 를 이용하였습니다.

문자 하나의 최대 길이가 50이라고 했으니까 set 51개로 이루어진 arr을 생성합니다.

arr[x] 의 의미는 길이가 x 인 문자들의 set 인 것입니다.

따라서 arr[1] 부터 arr[50] 까지 순서대로 출력한다면 크기에 따라 정렬된 순서가 될 것입니다.

그리고 각 arr[x] 내부의 값은 sorted 함수를 이용하여 정렬하여 출력합니다.

 

728x90

 

<보충 1>

sorted 함수의 key 값에 규칙을 추가하여 푸는 방식도 있습니다.

이런 방식은 문법이 좀 복잡해보일 것 같아서 사용하지 않았습니다만,

실제 상황에서는 유지보수와 가독성 때문에 key 값에 규칙을 추가하는 것을 선호합니다.

 

<보충 2>

아래 영상에서는 N 을 20001 로 두고 풀었습니다.

다행스럽게도 20001 >= 51 이기 때문에 문제가 풀렸습니다만, 그렇지 않았다면 틀렸을 것입니다.

제보해주신 jinyoung song 님 감사합니다.

 

풀이는 아래 영상을 참고 바랍니다.

www.youtube.com/watch?v=5WT6opA_ePk

 

저작권 라이선스: CC BY (출처만 표시하면 자유롭게 이용 가능)

728x90
반응형