π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.10026 μ λ‘μμ½ λ¬Έμ νμ΄
π λ¬Έμ
https://www.acmicpc.net/problem/10026
μ λ‘μμ½μ λΉ¨κ°μκ³Ό μ΄λ‘μμ μ°¨μ΄λ₯Ό κ±°μ λλΌμ§ λͺ»νλ€. λ°λΌμ, μ λ‘μμ½μΈ μ¬λμ΄ λ³΄λ κ·Έλ¦Όμ μλ μ¬λμ΄ λ³΄λ κ·Έλ¦Όκ³Όλ μ’ λ€λ₯Ό μ μλ€.
ν¬κΈ°κ° NΓNμΈ κ·Έλ¦¬λμ κ° μΉΈμ R(λΉ¨κ°), G(μ΄λ‘), B(νλ) μ€ νλλ₯Ό μμΉ ν κ·Έλ¦Όμ΄ μλ€. κ·Έλ¦Όμ λͺ κ°μ ꡬμμΌλ‘ λλμ΄μ Έ μλλ°,
ꡬμμ κ°μ μμΌλ‘ μ΄λ£¨μ΄μ Έ μλ€.
λ, κ°μ μμμ΄ μνμ’μ°λ‘ μΈμ ν΄ μλ κ²½μ°μ λ κΈμλ κ°μ ꡬμμ μνλ€. (μμμ μ°¨μ΄λ₯Ό κ±°μ λλΌμ§ λͺ»νλ κ²½μ°λ κ°μ μμμ΄λΌ νλ€)
μλ₯Ό λ€μ΄, κ·Έλ¦Όμ΄ μλμ κ°μ κ²½μ°μ
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR
μ λ‘μμ½μ΄ μλ μ¬λμ΄ λ΄€μ λ ꡬμμ μλ μ΄ 4κ°μ΄λ€. (λΉ¨κ° 2, νλ 1, μ΄λ‘ 1) νμ§λ§,
μ λ‘μμ½μΈ μ¬λμ ꡬμμ 3κ° λ³Ό μ μλ€. (λΉ¨κ°-μ΄λ‘ 2, νλ 1)
κ·Έλ¦Όμ΄ μ λ ₯μΌλ‘ μ£Όμ΄μ‘μ λ, μ λ‘μμ½μΈ μ¬λμ΄ λ΄€μ λμ μλ μ¬λμ΄ λ΄€μ λ ꡬμμ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
π μ κ·Όλ²
Q.10026 μ λ‘μμ½ λ¬Έμ νμ΄μ λλ€.
N*N 그리λμ κ° μΉΈλ§λ€ R(λΉ¨) G(μ΄) B(ν) λ‘ μμ΄ μΉ ν΄μ Έ μμ λ
μμμΌλ‘ μΈν΄ κ·Έλ¦Όμμ λλλ ꡬμμ μλ₯Ό ꡬνλ λ¬Έμ μ λλ€.
bfs / dfs νμμΌλ‘ λ¬Έμ νμ΄κ° κ°λ₯ν©λλ€.
bfs / dfs νμμ ν΅ν΄ κ°μ μμμΈ κ΅¬μλ€μ κ°μλ₯Ό ꡬνλ©΄
λ΅μ λμΆ ν μ μμ΅λλ€.
λ¨, μΌλ°μ μΈ κ²½μ°μ μ λ‘μμ½ μΈ μ¬λμ κ²½μ°λ ꡬν΄μΌνλ―λ‘
μ λ ₯μ λ°μ λ κ·Έλλ‘ λ°λ μΌλ°μ μΈ κ²½μ°μ
μ λ‘μμ½ κ²½μ°μλ λΉ¨κ°κ³Ό μ΄λ‘μμ κ°κ² λ΄μΌνλ―λ‘
λΉ¨κ°μΈ κ²½μ°λ₯Ό μ΄λ‘μμΌλ‘ μ λ ₯ν΄μ€λλ€.
κ·Έλμ
μΌλ°μ μΈ κ²½μ°μ μ λ‘μμ½μΈ κ²½μ°μ N*N 그리λλ₯Ό
νμν΄μ£Όλ©΄
λ΅μ ꡬν μ μμ΅λλ€.
π» μ½λ
package problem.bfsdfs;
import java.io.*;
public class Main_10026 {
static int n;
static boolean [][] visited;
static char [][] arr1;
static char [][] arr2;
static int moveX[] = {0,0,-1,1};
static int moveY[] = {-1,1,0,0};
static char currentColor;
static int currentCount=0;
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
solve(arr1);
solve(arr2);
bw.flush();
bw.close();
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
visited = new boolean[n][n];
arr1 = new char[n][n];
arr2 = new char[n][n];
for(int i=0; i<n; i++){
String temp[] = br.readLine().split("");
for(int j=0; j<n; j++){
char currentChar = temp[j].charAt(0);
arr1[i][j] = currentChar;
if(currentChar == 'R'){
currentChar = 'G';
}
arr2[i][j] = currentChar;
}
}
br.close();
}
public static void dfs(int x, int y, char[][] target){
visited[x][y] = true;
for(int i=0; i<4; i++){
int currentX = x+moveX[i];
int currentY = y+moveY[i];
if ( currentX < 0 || currentY< 0 || currentX>=n || currentY>=n)
continue;
if(currentColor == target[currentX][currentY] && !visited[currentX][currentY]){
dfs(currentX,currentY,target);
}
}
}
public static void solve(char[][] target){
currentCount = 0;
visited = new boolean[n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(!visited[i][j]){
currentColor = target[i][j];
dfs(i,j,target);
currentCount++;
}
}
}
System.out.println(currentCount);
}
}