๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Java] BOJ 10026 ์ ๋ก์ƒ‰์•ฝ

by ๐ŸŠ๊ทค๐ŸŠ 2024. 9. 3.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ 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

์ข€ ๋ถ€๋„๋Ÿฌ์šด ์‹ค์ˆ˜์ด๊ธดํ•œ๋ฐ... ์ฒ˜์Œ์— while๋ฌธ์—์„œ ๋ชป๋ฒ—์–ด๋‚˜๊ธธ๋ž˜ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ๊ฐ€ ๋ดค๋”๋‹ˆ... Queue์— ์žˆ๋˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์•ˆ ๋บ์—ˆ๋‹ค... ใ…Ž... (์‹ค์ˆ˜๋ฅผ ์กฐ์‹ฌํ•˜์ž..!!)

์ฝ”๋“œ

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));
                }
            }
        }
    }
}