728x90
문제설명
입력 & 출력
나의 풀이
문제 접근 방법
"백준 - 트리의 부모 찾기" 문제는 트리의 부모 노드를 찾는 문제입니다. 트리의 루트 노드는 항상 1이며, 루트 노드를 기준으로 2번 노드부터각 노드의 부모를 출력해야 합니다.
트리의 특징은 간선이 N-1개로 주어지며, 이는 사이클이 없고 모든 노드가 연결된 그래프를 뜻합니다.
하나의 그래프에서 루트를 기준으로 트리를 구성하는 방법은 여러 가지가 존재할 수 있습니다. 저는 문제를 이해하기 위해 다음과 같은 트리 형태를 그려보았습니다.
DFS 알고리즘을 사용하여 루트 1번부터 순회를 한다면, 1→6→3→5 순으로 내려가고, 다시 1로 돌아와서 4→2, 4→7 로 진행이 됩니다.
문제 접근
- 트리 구성 :
연결정보는 방향성이 없이 주어지기 때문에 양방향 연결을 위한 ArrayList[]를 사용하여 각 노드의 연결 정보를 저장 - DFS로 부모-자식 관계 파악: 루트(1번)부터 시작해서 연결된 노드를 자식으로 지정
알고리즘 동작
- DFS는 루트(1번)부터 시작하여: 1→6→3→5 순으로 깊이 우선 탐색
- 다시 1로 돌아와서 4→2, 4→7 순으로 진행
방문하지 않은 노드를 만나면 현재 노드를 그 노드의 부모로 지정
구현 순서
- 트리 구성: 각 노드의 연결 정보 저장
- DFS로 부모 지정: 연결된 미방문 노드 발견 시 부모로 지정
- 결과 출력: 2번 노드부터 순서대로 부모 노드 출력
전체 코드
DFS 알고리즘을 알고있다면 어렵지 않게 풀이할 수 있습니다.
문제의 핵심은 트리를 구성하는 것인데, 방향성이 존재하지 않기때문에 양방향 연결을 위한 ArrayList를 사용해줍니다.
또한, 노드는 1부터이기 때문에 좀 더 직관적인 풀이를 위하여 1-based 로 설정해줍니다.
7
1 6
6 3
3 5
4 1
2 4
4 7
null
[6, 4]
[4]
[6, 5]
[1, 2, 7]
[3]
[1, 3]
[4]
리스트 배열에 양방향 연결을 해준다면, 위와 같이 각 인덱스에 연결된 노드들이 저장됩니다.
그리고, dfs함수를 호출하여 1번 노드(루트)부터 시작해 방문하지 않은 노드를 만나면 현재 노드를 그 노드의 부모로 지정하고 dfs()함수를 재귀적으로 호출하여 깊이 우선 탐색을 수행합니다. 최종적으로 다음과 같은 부모 노드 정보가 저장됩니다.
[0, 0, 4, 6, 1, 3, 1, 4]
'Coding Test > 백준' 카테고리의 다른 글
[백준, 10026번] 적록색약 (DFS, 깊이 우선 탐색, Java) (0) | 2025.01.25 |
---|---|
[백준, 2468번] 안전 영역 (DFS, 깊이 우선 탐색, Java) (0) | 2025.01.24 |
[백준, 15686번] 치킨 배달 (브루트 포스, 백트래킹, Java) (1) | 2025.01.20 |
[백준, 9251번] LCS (LCS, 최장 공통 부분 수열, Java) (1) | 2025.01.19 |
[백준, 14889번] 스타트와 링크 (백트래킹, 브루트 포스, Java) (0) | 2025.01.13 |