https://www.acmicpc.net/problem/11725
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main_BJ_11725_트리의부모찾기 {
static ArrayList<Integer>[] list;
static int n;
static int[] parents;
static boolean[] visited;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
list = new ArrayList[n+1];
parents = new int[n+1];
visited = new boolean[n+1];
for(int i=1; i<=n; i++)
list[i] = new ArrayList<Integer>();
for(int i=1; i<n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
list[start].add(end);
list[end].add(start);
}
dfs(1);
for(int i=2; i<=n; i++)
System.out.println(parents[i]);
}//main
private static void dfs(int p){
visited[p] = true;
for(int i=0; i<list[p].size(); i++){
if(!visited[list[p].get(i)]){
parents[list[p].get(i)] = p;
dfs(list[p].get(i));
}
}
}//dfs
}
dfs를 사용해서 문제를 풀어봤다.
1. 연결 리스트를 활용해 연결된 노드들을 모두 적어준다.(단방향이 아니므로 양방향으로 넣어준다)
2. 루트 노드는 1이므로 1로 시작!
3. dfs를 돌리는 노드는 방문 처리후, 해당 노드에 연결된 친구들을 본다.
4. 방문하지 않은 노드를 dfs로 다시 돌려주는데, 현재 있는 노드가 다음 dfs를 돌릴 노드의 부모이므로, 배열에 저장해준다.
5. 모든 노드가 방문처리 되어 끝났다면 출력해주면 된다!
나름 간단한 문제였다!!
'코테 > 백준' 카테고리의 다른 글
백준 11866 요세푸스 문제0(JAVA) (0) | 2023.01.30 |
---|---|
백준 1181 단어정렬(JAVA) (0) | 2023.01.29 |
백준 1271 엄청난 부자2(JAVA) (0) | 2023.01.28 |
백준 2579 계단 오르기(JAVA) (0) | 2023.01.27 |
백준 17219 비밀번호 찾기(JAVA) (0) | 2023.01.26 |