happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/Python 문제풀이

[백준] 트리의 부모 찾기

2022. 7. 11. 16:04

https://www.acmicpc.net/problem/11725

 

11725번: 트리의 부모 찾기

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

www.acmicpc.net

dfs를 이용하는 문제입니다.

 

우선 문제부터 간단하게 요약하면, root가 없는 트리가 주어지는데 이때, 1번 node를 root로 가정했을 때, 각각의 노드들의 parent 노드가 무엇이 되는지를 return 해야 합니다. (트리의 연결 상태는 단순히 연결이 되어있다 라는 정보로만 주어집니다.)

 

<Solution>

우선 이 문제는 node나 tree class를 만들 필요가 없습니다. 마치 트리를 구현해야 하는 문제 같지만 dfs를 통해 충분히 해결 할 수 있습니다. 

  • 트리의 정보를 인접 리스트 형태로 구성합니다.
  • 1번 노드로 부터 dfs를 하며 parent를 갱신합니다.

이 과정을 통해 해결 할 수 있습니다. 

 

간단한 예시를 통해 살펴봅시다. 

위와 같은 노드의 상태에서는 

inital state
stack : [1]
parent : [0, 0, 0, 0, 0, 0, 0, 0]
visited : [False, False, False, False, False, False, False, False]    
----------------------------------------
stack : [4, 6]
parent : [0, 0, 0, 0, 1, 0, 1, 0]
visited : [False, True, False, False, False, False, False, False]     
----------------------------------------
stack : [4, 3]
parent : [0, 0, 0, 6, 1, 0, 1, 0]
visited : [False, True, False, False, False, False, True, False]      
----------------------------------------
stack : [4, 5]
parent : [0, 0, 0, 6, 1, 3, 1, 0]
visited : [False, True, False, True, False, False, True, False]       
----------------------------------------
stack : [4]
parent : [0, 0, 0, 6, 1, 3, 1, 0]
visited : [False, True, False, True, False, True, True, False]        
----------------------------------------
stack : [2, 7]
parent : [0, 0, 4, 6, 1, 3, 1, 4]
visited : [False, True, False, True, True, True, True, False]
----------------------------------------
stack : [2]
parent : [0, 0, 4, 6, 1, 3, 1, 4]
visited : [False, True, False, True, True, True, True, True]
----------------------------------------
stack : []
parent : [0, 0, 4, 6, 1, 3, 1, 4]
visited : [False, True, True, True, True, True, True, True]

다음과 같이 매번 pop한 element를 parent로 갱신시켜 주는 dfs를 통해 올바른 parent array를 구성할 수 있음을 알 수 있습니다. 

 

실제 구현은 아래와 같습니다.

import sys

N = int(sys.stdin.readline().rstrip())

connection_graph = [[] for _ in range(N+1)]

for _ in range(N-1):
    a, b = list(map(int, sys.stdin.readline().rstrip().split()))
    connection_graph[a].append(b)
    connection_graph[b].append(a)

# remove same element
for i, e in enumerate(connection_graph[:]):
    connection_graph[i] = list(set(e))

# dfs
stack = [1]
parent = [0 for _ in range(N+1)]
visited = [False for _ in range(N+1)]
# print('----------------------------------------')
# print('inital state')
# print(f'stack : {stack}')
# print(f'parent : {parent}')
# print(f'visited : {visited}')


while(stack):
    node_num = stack.pop()

    if visited[node_num]:
        continue

    visited[node_num] = True

    for e in connection_graph[node_num]:
        if not visited[e]: # not visied
            parent[e] = node_num
            stack.append(e)
        else:
            continue
    # print('----------------------------------------')
    # print(f'stack : {stack}')
    # print(f'parent : {parent}')
    # print(f'visited : {visited}')
for parent_ in parent[2:]:
    print(parent_)

 

반응형

'코딩테스트 > Python 문제풀이' 카테고리의 다른 글

[백준] 숨바꼭질 3  (0) 2022.07.12
[백준] N과 M (5)  (0) 2022.07.11
[백준] 구간 합 구하기 5  (0) 2022.07.11
[백준] 피보나치 수 6  (0) 2022.07.11
[백준] 플로이드  (0) 2022.07.10
    '코딩테스트/Python 문제풀이' 카테고리의 다른 글
    • [백준] 숨바꼭질 3
    • [백준] N과 M (5)
    • [백준] 구간 합 구하기 5
    • [백준] 피보나치 수 6
    happy318
    happy318

    티스토리툴바