isPowerfulBlog
[Solved] BOJ: 11725 | 트리의 부모 찾기 본문
문제
주어진 연결 상태로 트리를 만들어
각 노드의 부모노드 구하기
입력
- 첫번째 줄: 트리 길이
t
- 두번째 줄~2+t-1: 노드 연결 상태
출력
각 노드의 부모 노드 출력
접근
- 일단 연결 상태를 가지고 트리를 만든 후
- dfs로 부모 노드를 구하면 되겠...다?
풀이
입력 및 트리 만들기
n = int(input())
tree = {}
# make tree
for _ in range(n-1):
n1, n2 = map(int, input().split())
if n1 in tree:
tree[n1].append(n2)
else:
tree[n1] = [n2]
if n2 in tree:
tree[n2].append(n1)
else:
tree[n2] = [n1]
- dictionary를 이용해 트리를 만들었다
dfs
# dfs
visited = [0 for _ in range(n+1)]
def dfs(r):
for node in tree[r]:
if visited[node] == 0:
visited[node] = r
dfs(node)
- 루트노드에 연결되어있는 여러 노드들에 대해
- 방문한 적이 없는 노드라면 (0이라면)
- 방문 표시 인덱스에 부모 노드 값 넣어 줌 -> 0이 아니기때문에 방문처리도 동시에 됨
- 그 노드로 다시 dfs
출력
dfs(1)
for j in range(2, len(visited)):
print(visited[j])
- 시작을 1로 하여 dfs를 돌리고
- visted 리스트의 각 인덱스에 적힌 값(부모 노드 값) 출력
전체 코드
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
n = int(input())
tree = {}
# make tree
for _ in range(n-1):
n1, n2 = map(int, input().split())
if n1 in tree:
tree[n1].append(n2)
else:
tree[n1] = [n2]
if n2 in tree:
tree[n2].append(n1)
else:
tree[n2] = [n1]
# dfs
visited = [0 for _ in range(n+1)]
def dfs(r):
for node in tree[r]:
if visited[node] == 0:
visited[node] = r
dfs(node)
dfs(1)
for j in range(2, len(visited)):
print(visited[j])
- 정말 기본적인 dfs 문제
- 기본적이고 뭐고 다 까먹어서 헤맸다ㅠ.ㅠ
제출
Recursion Error
sys.setrecursionlimit(10**6)
- 재귀 제한 늘려서 해결
'Algorithm' 카테고리의 다른 글
[Solved] BOJ: 2457 | 공주님의 정원 (2) | 2023.12.22 |
---|---|
[자료구조] 큐, 스택, 힙 (1) | 2023.11.16 |
[Solved] BOJ: 4963 | 섬의 개수 (0) | 2023.02.02 |
[Solved] BOJ: 2630 | 색종이 만들기 (0) | 2022.12.06 |
[Solved] BOJ: 11053 | 가장 긴 증가하는 부분 수열 (0) | 2022.11.28 |