• toc {:toc}

๋ฌธ์ œ

์ ๋ก์ƒ‰์•ฝ์€ ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋А๋ผ์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ์€ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ๊ณผ๋Š” ์ข€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

ํฌ๊ธฐ๊ฐ€ Nร—N ์ธ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฐ ์นธ์— R(๋นจ๊ฐ•), G(์ดˆ๋ก), B(ํŒŒ๋ž‘) ์ค‘ ํ•˜๋‚˜๋ฅผ ์ƒ‰์น ํ•œ ๊ทธ๋ฆผ์ด ์žˆ๋‹ค. ๊ทธ๋ฆผ์€ ๋ช‡ ๊ฐœ์˜

๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋Š”๋ฐ, ๊ตฌ์—ญ์€ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋˜, ๊ฐ™์€ ์ƒ‰์ƒ์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋‘ ๊ธ€์ž๋Š” ๊ฐ™์€

๊ตฌ์—ญ์— ์†ํ•œ๋‹ค. (์ƒ‰์ƒ์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋А๋ผ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ™์€ ์ƒ‰์ƒ์ด๋ผ ํ•œ๋‹ค)

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทธ๋ฆผ์ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ดค์„ ๋•Œ ๊ตฌ์—ญ์˜ ์ˆ˜๋Š” ์ด 4 ๊ฐœ์ด๋‹ค. (๋นจ๊ฐ• 2, ํŒŒ๋ž‘ 1, ์ดˆ๋ก 1) ํ•˜์ง€๋งŒ, ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์€ ๊ตฌ์—ญ์„ 3 ๊ฐœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (๋นจ๊ฐ• - ์ดˆ๋ก 2, ํŒŒ๋ž‘ 1)

๊ทธ๋ฆผ์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ดค์„ ๋•Œ์™€ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ดค์„ ๋•Œ ๊ตฌ์—ญ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N ์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 100)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N ๊ฐœ ์ค„์—๋Š” ๊ทธ๋ฆผ์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ ๋ก์ƒ‰์•ฝ์ด ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ดค์„ ๋•Œ์˜ ๊ตฌ์—ญ์˜ ๊ฐœ์ˆ˜์™€ ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ดค์„ ๋•Œ์˜ ๊ตฌ์—ญ์˜ ์ˆ˜๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

์ถœ์ฒ˜:https://www.acmicpc.net/problem/10026

ํ’€์ด

์ผ๋ฐ˜์ธ์˜ ๊ตฌ๋ถ„์„ ํ•˜๊ณ  ๋‹ค์Œ ์ ๋ก์ƒ‰์•ฝ์˜ ๊ตฌ๋ถ„์„ ๊ณ„์‚ฐํ•˜์—ฌ 2 ๋ฒˆ BFS ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

2 ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด์„œ BFS ๋ฅผ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ๋” ๊ฐ„ํŽธํ•˜๊ณ  ๊น”๋”ํ•˜์ง€ ์•Š์•˜์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

ํ•จ์ˆ˜ ์ œ์ž‘ ์—ฐ์Šตํ•˜๊ธฐ

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
string board[105];
int n;
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
int Nvis[105][105];
int Bvis[105][105];
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    char color = ' ';
    for(int i = 0; i < n; i++){
        cin >> board[i];
    }
    
    queue<pair<int, int>> q;
    int normal = 1;
    for(int i = 0; i < n; i++){         // ์ผ๋ฐ˜ ์‚ฌ๋žŒ
        for(int j = 0; j < n; j++){
            if(Nvis[i][j] >= 1) continue;   // ์—ฌ๊ธฐ์„œ ๊ฐ™์€ ์ƒ‰์ผ ๋•Œ continueํ•ด์•ผํ•˜๋Š” ์ค„
            q.push({i, j});                 // ์•Œ์•˜์ง€๋งŒ ๋ฐ‘์—์„œ ๊ฑธ๋Ÿฌ์ฃผ๊ธฐ์— ํ•„์š” ์—†๋‹ค.
            Nvis[i][j] = normal++;
            color = board[i][j];
            while(!q.empty()){                  // ๊ฐ™์€ ์ƒ‰๊น” ํ™•์ธ
                auto cur = q.front(); q.pop();
                for(int dir = 0; dir < 4; dir++){
                    int nx = cur.X + dx[dir];
                    int ny = cur.Y + dy[dir];
                    if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
                    if(Nvis[nx][ny] >= 1 || board[cur.X][cur.Y] != board[nx][ny]) continue;
                    Nvis[nx][ny] = Nvis[cur.X][cur.Y];
                    q.push({nx, ny});
                }
            }
        }
    }
    normal--;
    cout << normal << ' ';
    for(int i = 0; i < n; i++) {        // ๋…น์ƒ‰์„ ๋นจ๊ฐ•๊ณผ ๊ฐ™๊ฒŒ
        for(int j = 0; j < n; j++) {
            if(board[i][j] == 'G'){
                board[i][j] = 'R';
            }
        }
    } 
    int blind = 1;   
    color = ' ';
    for(int i = 0; i < n; i++){         // ์ ๋ก์ƒ‰์•ฝ์˜ BFS
        for(int j = 0; j < n; j++){
            if(Bvis[i][j] >= 1) continue;
            q.push({i, j});
            Bvis[i][j] = blind++;
            color = board[i][j];
            while(!q.empty()){                  // ๊ฐ™์€ ์ƒ‰๊น” ํ™•์ธ
                auto cur = q.front(); q.pop();
                for(int dir = 0; dir < 4; dir++){
                    int nx = cur.X + dx[dir];
                    int ny = cur.Y + dy[dir];
                    if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
                    if(Bvis[nx][ny] >= 1 || board[cur.X][cur.Y] != board[nx][ny]) continue;
                    Bvis[nx][ny] = Bvis[cur.X][cur.Y]; q.push({nx, ny}); }
            }
        }
    }
    /*
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cout << Bvis[i][j];
        }
        cout << endl;
    }
    */
    cout << blind-1;
}