[백준] 24230: 트리 색칠하기 - JAVA
https://www.acmicpc.net/problem/24230
풀이
트리가 주어지고 트리를 주어진 색으로 칠해야 한다.
한 정점에 색을 칠하면 그 정점의 하위 정점들 모두에게 같은 색을 칠한다.
따라서 루트인 1번 정점부터 시작하여 아래로 내려가면서 색이 다르면 색을 칠해줬다.
dfs탐색을 통해 먼저 자식의 부모의 색을 따라서 칠하고
원하는 색과 비교하여 색을 다시 칠했다.
메모리: 111952KB
시간: 1684ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static int N, ans;
static int[] arr, color;
static ArrayList<ArrayList<Integer>> list;
static boolean[] visit, isColored;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N + 1];
color = new int[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i < N + 1; i++) {
color[i] = Integer.parseInt(st.nextToken());
}
list = new ArrayList<>();
for (int i = 1; i <= N + 1; i++) {
list.add(new ArrayList<>());
}
for (int i = 0; i < N - 1; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list.get(a).add(b);
list.get(b).add(a);
}
ans = 0;
visit = new boolean[N + 1];
dfs(1, 0);
System.out.println(ans);
}
private static void dfs(int node, int prev) {
visit[node] = true;
arr[node] = arr[prev];
if (arr[node] != color[node]) {
arr[node] = color[node];
ans++;
}
for (int next : list.get(node)) {
if (!visit[next]) {
dfs(next, node);
}
}
}
}