반응형
https://www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net

내 코드
import sys from collections import deque input = sys.stdin.readline N = int(input()) visited = [0] * (N + 1) result = [0] * (N + 1) graph = [[] for _ in range(N + 1)] for i in range(N - 1): a, b = map(int, input().split()) graph[a].append(b) graph[b].append(a) def bfs(v, visited, graph): q = deque([v]) visited[v] = 1 while q: x = q.popleft() for i in graph[x]: if not visited[i]: visited[i] = 1 result[i] = x q.append(i) bfs(1, visited, graph) for i in range(2, N + 1): print(result[i])
Review
문제를 보자마자 너비우선탐색(BFS)으로 풀어야겠다고 생각 하였다.
일반적인 너비우선탐색과 코드는 똑같고,
핵심은 result[노드] = 부모 로 코드를 짜줘야한다.
result[i] = x
깊이 우선 탐색(DFS)으로 풀 때도 같은 방식으로 코드를 짰다.
import sys sys.setrecursionlimit(10 ** 6) input = sys.stdin.readline N = int(input()) visited = [0] * (N + 1) result = [0] * (N + 1) graph = [[] for _ in range(N + 1)] for i in range(N - 1): a, b = map(int, input().split()) graph[a].append(b) graph[b].append(a) def dfs(v, visited, graph): visited[v] = 1 for i in graph[v]: if not visited[i]: visited[i] = 1 result[i] = v dfs(i, visited, graph) dfs(1, visited, graph) for i in range(2, N + 1): print(result[i])
재귀를 이용하여 DFS를 사용하였으니 문제에 따라 재귀의 깊이를 늘려줘야 한다.
BOJ의 채점 서버에서 이 값은 1,000으로 되어 있기 때문에
sys.setrecursionlimit()을 사용해서 늘려줘야 한다.
늘려주지 않는다면 RecursionError 가 발생한다.
sys.setrecursionlimit(10 ** 6) # 최대 재귀 깊이를 1,000,000 정도로 크게 설정
반응형
'BOJ > Python' 카테고리의 다른 글
[프로그래머스] 신고 결과 받기 파이썬 (0) | 2023.11.20 |
---|---|
백준 1238번 파티 파이썬 (0) | 2023.06.22 |
백준 11003번 최솟값 찾기 파이썬 (0) | 2023.02.17 |
백준 12891번 DNA 비밀번호 파이썬 (0) | 2023.02.14 |
백준 25305번 커트라인 파이썬 (0) | 2023.01.19 |