

처음에는 문제가 너무 이해가 안되서 천천히 그려가며 이해하는것부터 시작했다.
일단 규칙을 보니 노드의 갯수와 입력값의 수 중 가장 큰 값이 동일하고, 1부터 시작하여 N번까지 있는것을 알아차리고는 바로 그림으로 그려서 확인했다.


이러한 모습이 나와서 출력값을 보니
맨 위 출력값은
2의 부모의 값
3의 부모의 값
4의 부모의 값
...
N - 1의 부모의 값
이 출력 되어있다.
이 때 루트는 1 즉, 최상위 트리는 부모가 없기때문에,
각 숫자를 트리로 연결하고 문제해결을 해보기 시작했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
class Main {
static ArrayList<Integer>[] graph;
static int[] parent;
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
graph = new ArrayList[N + 1];
parent = new int[N + 1];
visited = new boolean[N + 1];
for (int i = 1; i <= N; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < N - 1; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
graph[u].add(v);
graph[v].add(u);
}
dfs(1);
StringBuilder sb = new StringBuilder();
for (int i = 2; i <= N; i++) {
sb.append(parent[i]).append("\n");
}
System.out.println(sb);
}
static void dfs(int node) {
visited[node] = true;
for (int child : graph[node]) {
if (!visited[child]) {
parent[child] = node;
dfs(child);
}
}
}
}


문제를 잘 이해하지도 못했고, 풀이를 많은곳에서 검색해보고 찾아보고 풀었기 때문에 이에 대한 공부는 아직 더 필요한것 같다. 그래프와 DFS(깊이 우선 탐색) 알고리즘 , 그리고 재귀함수 쪽을 더 깊이 학습해야 할 것 같다.