[Python] BOJ 14725 - 개미굴
https://www.acmicpc.net/problem/14725
14725번: 개미굴
첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N개가 주어진다. (1 ≤ N ≤ 1000) 두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이
www.acmicpc.net
# Trie(트라이) 자료구조로 푸는 문제이다.
1. Trie클래스를 선언한다.
1-1. insert메소드: 입력받은 먹이들(food배열)을 반복문으로 돌면서 cur_node의 key에 먹이가 없다면
cur_node[현재먹이] = {}로 만들어주고, cur_node의 key에 먹이가 존재한다면
cur_node = cur_node[string]으로 다음 먹이를 가리키도록 한다.
먹이의 마지막에는 '*'을 삽입해준다.
1-2. print_list메소드: 마지막에 개미굴의 시각화된 구조를 출력하기 위한 메소드이다.
처음에 cur_node에 trie.root가 들어온다. 만약 '*' in cur_node이면 먹이의 마지막이므로
return을 해준다.
cur_node의 key값을 반복문으로 돌며 cnt(현재깊이) * '--' + child(현재 먹이) 를 출력하고
self.print_list(cnt+1, cur_node[child]) 로 재귀호출을 한다.
즉, 먹이의 끝에 도달할때까지 계속 dfs형식으로 출력해주는 것이다.
2. N만큼 k와 먹이정보 t를 입력받고 먹이들을 food_list에 append해준다.
"같은 층에 여러개의 방이 있을 때에는 사전 순서가 앞서는 먹이 정보가 먼저 나온다."
모든 정보 N개를 입력받은 뒤 위의 조건을 만족시키기 위해 food_list를 sort해준다.
3. 정렬한 뒤 food_list에 있는 먹이들을 trie에 insert해준다.
trie.print_list(0, trie.root)를 해주고 맨 위의 개미굴 입구로부터 개미굴 내부구조를 시각화해서 출력한다.
import sys
input = sys.stdin.readline
class Trie:
def __init__(self):
self.root = {} # 자식저장
def insert(self, food):
cur_node = self.root
for string in food:
if string not in cur_node:
cur_node[string] = {}
cur_node = cur_node[string]
cur_node['*'] = True # 문자열 마지막에 * 삽입
def print_list(self, cnt, cur_node):
if '*' in cur_node:
return
for child in cur_node:
print("--" * cnt + child)
self.print_list(cnt+1, cur_node[child])
trie = Trie()
N = int(input())
food_list = []
for _ in range(N):
k, *t = map(str,input().split())
food_list.append(t)
food_list.sort()
for foods in food_list:
trie.insert(foods)
trie.print_list(0, trie.root)
(solve.ac 티어: 골드 2)
'문제풀이 > BaekjoonOnlineJudge' 카테고리의 다른 글
[Python] BOJ 20003 - 거스름돈이 싫어요 (0) | 2021.10.02 |
---|---|
[Python] BOJ 2564 - 경비원 (0) | 2021.10.01 |
[Python] BOJ 21610 - 마법사 상어와 비바라기 (0) | 2021.09.28 |
[Python] BOJ 17390 - 이건 꼭 풀어야 해! (0) | 2021.09.26 |
[Python] BOJ 16571 - 알파 틱택토 (1) | 2021.09.25 |