๋ฌธ์
๋ฌธ์ ๋งํฌ https://www.acmicpc.net/problem/11723
- ์ ๋ก์์ฝ์ ๋นจ๊ฐ์๊ณผ ์ด๋ก์์ ์ฐจ์ด๋ฅผ ๊ฑฐ์ ๋๋ผ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์, ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ์ ์๋ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ๊ณผ๋ ์ข ๋ค๋ฅผ ์ ์๋ค.
- ํฌ๊ธฐ๊ฐ N×N์ธ ๊ทธ๋ฆฌ๋์ ๊ฐ ์นธ์ R(๋นจ๊ฐ), G(์ด๋ก), B(ํ๋) ์ค ํ๋๋ฅผ ์์น ํ ๊ทธ๋ฆผ์ด ์๋ค.
- ๊ทธ๋ฆผ์ ๋ช ๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋์ด์ ธ ์๋๋ฐ, ๊ตฌ์ญ์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋, ๊ฐ์ ์์์ด ์ํ์ข์ฐ๋ก ์ธ์ ํด ์๋ ๊ฒฝ์ฐ์ ๋ ๊ธ์๋ ๊ฐ์ ๊ตฌ์ญ์ ์ํ๋ค. (์์์ ์ฐจ์ด๋ฅผ ๊ฑฐ์ ๋๋ผ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ์์์ด๋ผ ํ๋ค)
- ์๋ฅผ ๋ค์ด, ๊ทธ๋ฆผ์ด ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์
RRRBB GGBBB BBBRR BBRRR RRRRRโ
- ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ด ๋ดค์ ๋ ๊ตฌ์ญ์ ์๋ ์ด 4๊ฐ์ด๋ค. (๋นจ๊ฐ 2, ํ๋ 1, ์ด๋ก 1) ํ์ง๋ง, ์ ๋ก์์ฝ์ธ ์ฌ๋์ ๊ตฌ์ญ์ 3๊ฐ ๋ณผ ์ ์๋ค. (๋นจ๊ฐ-์ด๋ก 2, ํ๋ 1)
- ๊ทธ๋ฆผ์ด ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ก์ ๋, ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ดค์ ๋์ ์๋ ์ฌ๋์ด ๋ดค์ ๋ ๊ตฌ์ญ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
- ์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 100)
- ๋์งธ ์ค๋ถํฐ N๊ฐ ์ค์๋ ๊ทธ๋ฆผ์ด ์ฃผ์ด์ง๋ค.
- ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ด ๋ดค์ ๋์ ๊ตฌ์ญ์ ๊ฐ์์ ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ดค์ ๋์ ๊ตฌ์ญ์ ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ถ๋ ฅํ๋ค.
์์ด๋์ด
- ์ฐ์ ์ ๋ ฅ๋ถํฐ ์ ๋ก์์ฝ์ธ ์ฌ๋๊ณผ ์๋์ฌ๋์ ๊ตฌ๋ถํด์ ๋ฐ๋ก ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๋ค์ ๋ชจ๋ ์์ ๋ณผ ์ ์์ผ๋ฏ๋ก ์ ๋ ฅ๋ฐ๋ ๊ทธ๋๋ก๋ฅผ ์ ์ฅํ๊ณ , ์ ๋ก์์ฝ์ธ ์ฌ๋๋ค์ R๊ณผ G๋ฅผ ๊ตฌ๋ถํด์ ๋ณด์ง ๋ชปํ๋ G๋ฅผ ์ ๋ ฅ๋ฐ์ ๋๋ง๋ค R๋ก ๋ฐ๊ฟ์ ์ ์ฅํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ๋ฐฐ์ด์ ๋ํ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ์ ์ฅํ boolean 2์ฐจ์ ๋ฐฐ์ด์ ๋ฐ๋ก ๋ง๋ค๊ณ BFS๋ฅผ ๋๋ ธ๋ค.
- ๋ชจ๋ ๋ ธ๋๋ฅผ ๋๋ฉด์ ์ฐ์ ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๋ค์ ๋ฐฐ์ด์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ง๋ฌ์ ๋, ํด๋น ์ขํ๊ฐ์ Queue์ ๋ฃ๊ณ ์ขํ๊ฐ์ ํด๋นํ๋ ์์ ๋ฐ๋ก ์ ์ฅํด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ํ์ข์ฐ๋ฅผ ์ด๋ํ๋ฉด์ ๋ฐฐ์ด์ ๋ฒ์ด๋์ง ์์ผ๋ฉด์ ๋ฐฉ๋ฌธํ์ง ์์๊ณ ์ฒ์ ์ ๋ ฅ๋ค์ด์จ ์ขํ์ ์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ, ์ด๋ํ ์ขํ๊ฐ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ Queue์ ๋ฃ์ด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ Queue์ ์๋ฌด๋ฐ ๊ฐ๋ ์์ ๊ฒฝ์ฐ, while๋ฌธ์ ์ข ๋ฃํด์ฃผ๊ณ BFS๋ฅผ ๋์จ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๋ค์ด ๋ณด๋ ๊ตฌ์ญ ๊ฐ์๋ฅผ ์นด์ดํธ + 1 ํด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ ๋ก์์ฝ์ธ ์ฌ๋๋ค์ ๋ํ ๋ฐฐ์ด๋ ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๋ค์ ๋ํ ๋ฐฐ์ด์์ ํ๋ ๊ฒ ์ฒ๋ผ ๋๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ณผ ์ ์๋ ๊ตฌ์ญ์ ๊ฐ์๋ฅผ ์นด์ดํธํด์ค๋ค.
๊ฒช์ ์ํ์ฐฉ์ค
- X
์ฝ๋
import java.awt.*;
import java.io.*;
import java.util.*;
public class BOJ10026 {
static int N;
static char RGB[][];
static char RB[][];
static boolean rgb_visited[][];
static boolean rb_visited[][];
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// ํ, ์ด
N = Integer.parseInt(br.readLine());
// ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ด ๋ณด๋๊ฑธ ์ ์ฅํ ๋ฐฐ์ด
RGB = new char[N][N];
// ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ณด๋๊ฑธ ์ ์ฅํ ๋ฐฐ์ด
RB = new char[N][N];
// ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ฐฐ์ด
rgb_visited = new boolean[N][N];
// ์ ๋ก์์ฝ์ธ ์ฌ๋์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ฐฐ์ด
rb_visited = new boolean[N][N];
for(int i = 0; i < N; i++){
String s = br.readLine();
for(int j = 0; j < N; j++){
char c = s.charAt(j);
// ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ ๊ทธ๋๋ก ๋ฐฐ์ด์ ์ ์ฅ
RGB[i][j] = c;
// ์
๋ ฅ๊ฐ์ด G๊ฐ ๋ค์ด์จ๋ค๋ฉด ์ ๋ก์์ฝ์ธ ์ฌ๋๋ค์
// R๊ณผ ๊ฐ์ด ๋ณด๊ธฐ ๋๋ฌธ์ R๋ก ์ ์ฅ
if(c == 'G'){
RB[i][j] = 'R';
}
// G๊ฐ ์๋ ๋๋ ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ฒ๋ผ ๊ทธ๋๋ก ์ ์ฅ
else{
RB[i][j] = c;
}
}
}
int rgb_cnt = 0;
int rb_cnt = 0;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
// ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๋ค์ ์ ์ฅํด๋์ ๋ฐฐ์ด์์
// ๋ฐฉ๋ฌธํ์ง ์์ ์ขํ๋ฅผ ๋ง๋ฌ๋ค๋ฉด
if(!rgb_visited[i][j]){
// ํด๋น ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก BFS๋ฅผ ๋๋ฆฌ๊ณ
RGB_BFS(RGB[i][j], i, j);
// ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๋ค์ด ๋ณด๋ ๊ตฌ์ญ ์นด์ดํธ + 1
rgb_cnt = rgb_cnt + 1;
}
// ์ ๋ก์์ฝ์ธ ์ฌ๋๋ค์ ์ ์ฅํด๋์ ๋ฐฐ์ด์์
// ๋ฐฉ๋ฌธํ์ง ์์ ์ขํ๋ฅผ ๋ง๋ฌ๋ค๋ฉด
if(!rb_visited[i][j]){
// ํด๋น ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก BFS๋ฅผ ๋๋ฆฌ๊ณ
RB_BFS(RB[i][j], i, j);
// ์ ๋ก์์ฝ์ธ ์ฌ๋๋ค์ด ๋ณด๋ ๊ตฌ์ญ ์นด์ดํธ + 1
rb_cnt = rb_cnt + 1;
}
}
}
System.out.println(rgb_cnt + " " + rb_cnt);
}
// ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๋ค์ ์ํ BFS
public static void RGB_BFS(char color, int x, int y){
Queue<Point> q = new LinkedList<>();
// ์
๋ ฅ๋ค์ด์จ ์๊น์ ๋ฐ๋ก ์ ์ฅ
char c = color;
// ์
๋ ฅ๋ค์ด์จ ์ขํ๋ฅผ Queue์ ์ ์ฅ
q.offer(new Point(x, y));
rgb_visited[x][y] = true;
// Queue๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต
while(!q.isEmpty()){
int xx = q.peek().x;
int yy = q.peek().y;
q.poll();
// ๊ธฐ์ค์ขํ์์ ์ํ์ข์ฐ ์ด๋
for(int i = 0; i < 4; i++){
int nx = xx + dx[i];
int ny = yy + dy[i];
// ๋ง์ฝ ์ด๋ํ ์ขํ๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค๋ฉด continue
if(nx >= N || nx < 0 || ny >= N || ny < 0){
continue;
}
// ๋ง์ฝ ํด๋น ์ขํ๋ฅผ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ณ ์
๋ ฅ๋ค์ด์จ ์๊น๊ณผ ๊ฐ๋ค๋ฉด
// ๊ฐ์ ๋ฒ์๋ก ๋ณด๊ณ ์๋ ๊ฒ์ด๋ฏ๋ก
if(!rgb_visited[nx][ny] && (RGB[nx][ny] == c)){
// ํด๋น ์ขํ๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ
rgb_visited[nx][ny] = true;
// Queue์ ํด๋น ์ขํ๋ฅผ ๋ฃ์
q.offer(new Point(nx, ny));
}
}
}
}
// ์ ๋ก์์ฝ์ธ ์ฌ๋๋ค์ ์ํ BFS
public static void RB_BFS(char color, int x, int y){
Queue<Point> q = new LinkedList<>();
// ์
๋ ฅ๋ค์ด์จ ์๊น์ ๋ฐ๋ก ์ ์ฅ
char c = color;
// ์
๋ ฅ๋ค์ด์จ ์ขํ๋ฅผ Queue์ ์ ์ฅ
q.offer(new Point(x, y));
rb_visited[x][y] = true;
// Queue๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต
while(!q.isEmpty()){
int xx = q.peek().x;
int yy = q.peek().y;
q.poll();
// ๊ธฐ์ค์ขํ์์ ์ํ์ข์ฐ ์ด๋
for(int i = 0; i < 4; i++){
int nx = xx + dx[i];
int ny = yy + dy[i];
// ๋ง์ฝ ์ด๋ํ ์ขํ๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค๋ฉด continue
if(nx >= N || nx < 0 || ny >= N || ny < 0){
continue;
}
// ๋ง์ฝ ํด๋น ์ขํ๋ฅผ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ณ ์
๋ ฅ๋ค์ด์จ ์๊น๊ณผ ๊ฐ๋ค๋ฉด
// ๊ฐ์ ๋ฒ์๋ก ๋ณด๊ณ ์๋ ๊ฒ์ด๋ฏ๋ก
if(!rb_visited[nx][ny] && (RB[nx][ny] == c)){
// ํด๋น ์ขํ๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๊ณ
rb_visited[nx][ny] = true;
// Queue์ ํด๋น ์ขํ๋ฅผ ๋ฃ์
q.offer(new Point(nx, ny));
}
}
}
}
}