백준 11725 트리의 부모 찾기 실버2

2025. 4. 29. 11:00·개발새발문제

 

 

문제

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

 

입력

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

 

예제 입력1

7
1 6
6 3
3 5
4 1
2 4
4 7

 

 

예제 입력2

12
1 2
1 3
2 4
3 5
3 6
4 7
4 8
5 9
5 10
6 11
6 12

 

 

출력

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

 

예제 출력1

4
6
1
3
1
4

 

예제 출력2

1
1
2
3
3
4
4
5
5
6
6

 

 

코드

풀이1 DFS

import sys
sys.setrecursionlimit(10**6)

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


v = [0] * (N+1)						# 방문 배열
tree = [[] for _ in range(N+1)]		# 간선 정보 저장할 공간
p = [0] * (N+1)						# 부모 노드 저장

# 간선 정보 저장
for _ in range(N-1): 
    n1, n2 = map(int, sys.stdin.readline().split())
    tree[n1].append(n2)
    tree[n2].append(n1)

def dfs(num):
    v[num] = 1
    for i in tree[num]:
        if v[i] == 0:
            p[i] = num
            dfs(i)

dfs(1)

for i in range(2, N+1):
    print(p[i])

 

 

코드 설명

import sys
sys.setrecursionlimit(10**6)

- 파이썬 인터프리터가 허용하는 재귀 호출의 최대 깊이를 설정

- 일반적으로 설정되어있는 재귀의 깊이 제한 때문에 RecursionError 가 발생할 수 있어서 사용

 

특이한 점

- PyPy3로 하면 메모리 초과가 발생함 : 재귀 호출 스택의 메모리 사용량이 Python보다 훨씬 크기 때문

 

 

풀이2 DFS

 

이전과 메모리 사용량은 같은데,

`N = int(sys.stdin.readline())`이 빠졌더니 시간이 엄청 늘었다

import sys
sys.setrecursionlimit(10**6)

N = int(input())

v = [0] * (N+1)
tree = [[] for _ in range(N+1)]
p = [0] * (N+1)


# 인접 노드 저장
for _ in range(1,N) :
    n1,n2 = map(int,input().split())
    tree[n1].append(n2)
    tree[n2].append(n1)


# 트리 순회
def dfs(num) :
    v[num] = 1
    for i in tree[num] :
        if v[i] == 0 :      # 방문 안했다면
            p[i] = num      # 직전 노드를 부모 노드에 저장
            dfs(i)          # 새로운 노드 탐색
    
# 트리 호출
dfs(1)

# 정답 출력
for i in range(2,N+1) :
    print(p[i])

 

 

풀이3 BFS

 

-` N = int(sys.stdin.readline())`를 안썼더니 시간은 여전히 느리지만, Q를 사용함으로써 메모리는 줄였다

from collections import deque

N = int(input())


tree = [[] for _ in range(N+1)]
p = [0] * (N+1)


# 인접 노드 저장
for _ in range(N-1) :
    n1,n2 = map(int,input().split())
    tree[n1].append(n2)
    tree[n2].append(n1)


# 트리 순회
def bfs(start) :
    q = deque([start])
    while q :
        current = q.popleft()
        for next in tree[current] :
            if p[next] == 0 :
                p[next] = current
                q.append(next)

bfs(1)

# 정답 출력
for i in range(2,N+1) :
    print(p[i])

 

이 문제의 포인트

이 문제의 포인트는 이전 노드가 부모 노드인 것을 알아채는 것!

'개발새발문제' 카테고리의 다른 글

백준 1987 알파벳 골드4  (0) 2025.05.01
알고리즘 N-Queen(백준 9663번) 파이썬  (0) 2025.02.27
알고리즘 우선순위큐 - 최대 힙(백준 11279번) 파이썬  (0) 2025.02.23
백준 1009 분산처리 만만치않은 브론즈2  (0) 2025.02.12
백준 1991 트리순회 실버1  (0) 2025.02.05
'개발새발문제' 카테고리의 다른 글
  • 백준 1987 알파벳 골드4
  • 알고리즘 N-Queen(백준 9663번) 파이썬
  • 알고리즘 우선순위큐 - 최대 힙(백준 11279번) 파이썬
  • 백준 1009 분산처리 만만치않은 브론즈2
birdsfoot
birdsfoot
개발새발개발 입니다.
  • birdsfoot
    개발새발개발
    birdsfoot
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • 개발새발개발 (74)
        • Frontend Study (0)
        • Kotlin (9)
        • React (29)
        • TypeScript (1)
        • Figma (2)
        • JavaScript (26)
        • Git (0)
      • 개발새발문제 (14)
      • 취업역량강화 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    우선순위큐 파이썬
    androidstudio
    div 중복
    안드로이드 컬러 팔레트
    map
    안드로이드스튜디오 api 통신
    안드로이드 전역 폰트
    useState
    javascript
    kotlin설치
    오토레이아웃
    안드로이드 코틀린
    prettier 안됨
    안드로이드 스튜디오 구조
    vscode prettier 오류
    코틀린 로그인
    useReducer
    안드로이드스튜디오
    안드로이드 배경색
    kotlin환경구축
    타입스크립트 시작
    백준 분산처리
    비동기
    코틀린 프론트엔드
    prettier 오류
    안드로이드 앱 구조
    안드로이드 배경 설정
    component
    백준
    Callback
    코틀린
    코틀린api통신
    타입스크립트 컴파일러 설정
    Kotlin
    setstate
    React
    코틀린환경셋팅
    피그마앱만들기
    안드로이드 스튜디오 컬러 지정
    안드로이드 typography
    props
    안드로이드 제트팩 컬러 지정
    JSX
    피그마
    안드로이드스튜디오 로그인
    html 가독성
    react 가독성
    prettier 적용 안됨
    피그마아이콘
    state
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
birdsfoot
백준 11725 트리의 부모 찾기 실버2
상단으로

티스토리툴바