문제
문제
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
문제 풀이
주어진 트리에서 각노드의 부모를 구하는 문제이다. BFS(Binary Find Search) 알고리즘을 활용하여 해당 문제를 해결 할 수 있었다.
노드의 개수 n과 트리의 연결 정보를 입력으로 받아 ArrayList 배열을 이용하여 인접 리스트를 구성한다.
static ArrayList<Integer>[] tree;
인접 리스트로 구성된 값들은 아래 표와 같다.
for (int i = 0; i < n - 1; i++) {
StringTokenizer st = new StringTokenizer(sc.nextLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
tree[a].add(b);
tree[b].add(a);
}
부모 노드의 정보를 담을 수 있는 parent 배열을 선언 및 초기화를 해준다.
static int[] parent;
BFS 탐색을 시작하기 위해 방문 여부를 체크할 visited 배열과 Queue를 선언한다.
boolean[] visited = new boolean[n + 1];
Queue<Integer> queue = new LinkedList<>();
시작노드 1을 방문 체크하고 큐에 추가해준다.
queue.offer(1);
visited[1] = true;
큐가 빈 값이 될 때 까지 반복문을 수행하면서 현재 노드에서 갈 수 있는 자식 노드들을 순회한다.
자식 노드를 아직 방문하지 않았다면, visted 배열을 true로 설정하고 parent 배열에 현재 노드 정보를 저장한 뒤, 큐 에 자식 노드를 추가한다.
BFS 탐색이 끝나면 parent 배열을 순회하여 노드 2부터 각 노드의 부모 노드 정보를 출력한다.
나의 답안
import java.util.*;
public class Main {
static int n;
static ArrayList<Integer>[] tree;
static int[] parent;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = Integer.parseInt(sc.nextLine());
tree = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
tree[i] = new ArrayList<>();
}
parent = new int[n + 1];
for (int i = 0; i < n - 1; i++) {
StringTokenizer st = new StringTokenizer(sc.nextLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
tree[a].add(b);
tree[b].add(a);
}
bfs();
for (int i = 2; i <= n; i++) {
System.out.println(parent[i]);
}
}
private static void bfs() {
boolean[] visited = new boolean[n + 1];
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
visited[1] = true;
while (!queue.isEmpty()) {
int cur = queue.poll();
for (int child : tree[cur]){
if (!visited[child]) {
queue.offer(child);
parent[child] = cur;
visited[child] = true;
}
}
}
}
}
'BackJoon > Algorithm' 카테고리의 다른 글
(1254) 팰린드롬 만들기 (0) | 2023.04.03 |
---|---|
(5613) 계산기 프로그램 (0) | 2023.03.27 |
(10807) 개수 세기 (0) | 2023.03.21 |
(2830) 행성 X3 (0) | 2023.03.21 |
(9012)괄호 (0) | 2023.03.21 |