[Python] 백준/BOJ 11725번: 트리의 부모 찾기 (Silver 2)

2025. 2. 5. 11:00·Algorithm/백준 (BOJ)

💻 Problem

문제 보러 가기

 

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

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

 

💡 Approach

사실 처음에는 복잡하게 생각해서 코드 짜기 헷갈렸다...

2번부터 n번까지의 노드를 출력하려면 2 ~ n 반복문으로 탐색 함수를 돌려서 각 결과를 출력하는 건 줄 알았다.

그래서 연결된 노드 중에 루트 노드가 있으면 루트 노드가 부모 노드이고.. 연결된 노드가 하나이면 연결된 노드가 부모 노드이고.. 이런 조건문을 달아줬었고

탐색하려는 노드와 연결된 각 노드들이 자식 노드인지 부모 노드인지 판별해야 한다고 생각했다.

 

근데 그냥 단순 dfs 문제였당 ㅎㅎ

왜 이렇게 복잡하게 생각하고 있었나 약간 허무!

생각해 보니 루트 노드에서부터 쭉 내려가면 어떤 게 부모 노드이고 어떤 게 자식 노드인지 알 수 있었담..

 

일단 간선 정보를 입력받을 때는 어떤 게 부모 노드이고 어떤 게 자식 노드인지 모르니 양방향으로 그래프를 만들어야 한다.

 

자 그럼 dfs로 탐색 시작~~~~

루트 노드인 1부터 시작한다!

 

dfs 함수에서 현재 탐색 중인 노드는 부모 노드이다!

이 부모 노드의 자식 노드들을 찾아 몇 번 노드의 자식 노드인지 기록해 줄 것이다.

이를 위해 방문 처리 배열(visited)을 만들어뒀는데, 여기서 방문 처리뿐만 아니라 부모 노드 번호까지 기록해 준다.

기본적으로 0으로 세팅해 뒀기에 아직 방문하지 않은 노드면 visited[child]가 0일 것이고, 이미 방문한 노드면 visited[child]에 부모 노드 번호가 기록되어 있을 것이다.

 

모든 탐색이 완료되었다면 visited의 각 노드에 부모 노드 번호가 기록되어 있을 것이다.

visited를 출력하면 끝!

 

예제 입력 1

그림으로 그리면서 이해했다~

 

✏️ Solution

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10 ** 5)

def dfs(parent):
    # 부모 노드와 연결된 자식 노드들을 탐색한다
    for child in graph[parent]:
        # 아직 방문하지 않은 노드면 방문한다다
        if not visited[child]:
            # 부모 노드와 연결된 자식 노드를 방문 처리한다
            # 방문 처리에는 T/F가 아닌 자신의 부모 노드 번호를 기록한다
            visited[child] = parent
            dfs(child)

n = int(input())
graph = [[] for _ in range(n + 1)]
visited = [0] * (n + 1)

# 간선 정보로 그래프 만들기
for _ in range(n - 1):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)

dfs(1)
print(*visited[2:], sep='\n')

이전에 dfs 문제 (18126. 너구리 구구)를 풀 때 sys.setrecursionlimit()을 설정해야 한다는 걸 알게 되었는데 이번에도 dfs로 풀었으니 이를 설정해야 했다.

노드의 개수가 곧 트리의 최대 깊이인데 n의 최댓값이 10 ^ 5이므로 재귀 깊이 또한 10 ^ 5로 세팅했다.

 

⏱️ 시간복잡도

  • O(n)

노드의 개수와 간선의 개수를 더하면 n + (n - 1)이다.

즉, 2n - 1이므로 n의 최댓값인 100,000(10 ^ 5)을 대입하면 2 * 10 ^ 5 - 1이다.

반응형

'Algorithm > 백준 (BOJ)' 카테고리의 다른 글

[Python] 백준/BOJ 21736번: 헌내기는 친구가 필요해 (Silver 2)  (0) 2025.02.07
[Python] 백준/BOJ 6593번: 상범 빌딩 (Gold 5)  (2) 2025.02.06
[Python] 백준/BOJ 18126번: 너구리 구구 (Silver 2)  (0) 2025.02.04
[Python] 백준/BOJ 16928번: 뱀과 사다리 게임 (Gold 5)  (0) 2025.02.03
'Algorithm/백준 (BOJ)' 카테고리의 다른 글
  • [Python] 백준/BOJ 21736번: 헌내기는 친구가 필요해 (Silver 2)
  • [Python] 백준/BOJ 6593번: 상범 빌딩 (Gold 5)
  • [Python] 백준/BOJ 18126번: 너구리 구구 (Silver 2)
  • [Python] 백준/BOJ 16928번: 뱀과 사다리 게임 (Gold 5)
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (146)
      • SSAFY (10)
      • Algorithm (72)
        • 이론 (5)
        • 백준 (BOJ) (66)
        • 프로그래머스 (1)
      • Language (9)
        • JavaScript (0)
        • TypeScript (0)
        • Java (9)
        • Python (0)
      • Library & Runtime (15)
        • React (13)
        • Node.js (2)
      • Framework (9)
        • 이론 (2)
        • Next.js (3)
        • Vue (4)
      • DevOps (3)
        • Git (3)
      • WEB (18)
        • HTML (9)
        • error (7)
        • etc (2)
      • Computer (5)
        • 자격증 (2)
        • tip (2)
        • etc (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    vue
    우선순위큐
    카카오맵
    SSAFYcial
    해시
    Error
    kakaomap
    DP
    싸피
    알고리즘
    파이썬
    github
    오블완
    html5
    누적합
    강의
    블록체인
    bfs
    자바
    Java
    백준
    딕셔너리
    티스토리챌린지
    렌더링최적화
    SSAFY
    Algorithm
    React
    Next.js
    dfs
    재귀
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
올콩
[Python] 백준/BOJ 11725번: 트리의 부모 찾기 (Silver 2)
상단으로

티스토리툴바