[c++] BOJ 10026 :: ์ ๋ก์ƒ‰์•ฝ

๋‚œ์ด๋„ : ๊ณจ๋“œ 5

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 25๋ถ„

 

๋ฌธ์ œ

์ ๋ก์ƒ‰์•ฝ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฌธ์ œ

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

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฐ ์นธ์— R(๋นจ๊ฐ•), G(์ดˆ๋ก), B(ํŒŒ๋ž‘) ์ค‘ ํ•˜๋‚˜๋ฅผ ์ƒ‰์น ํ•œ ๊ทธ๋ฆผ์ด ์žˆ๋‹ค. ๊ทธ๋ฆผ์€ ๋ช‡ ๊ฐœ์˜ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋Š”๋ฐ, ๊ตฌ์—ญ์€ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋˜, ๊ฐ™์€ ์ƒ‰์ƒ์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋‘ ๊ธ€์ž๋Š” ๊ฐ™์€ ๊ตฌ์—ญ์— ์†ํ•œ๋‹ค. (์ƒ‰์ƒ์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋Š๋ผ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ™์€ ์ƒ‰์ƒ์ด๋ผ ํ•œ๋‹ค)

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

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

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

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

 

ํ’€์ด

  • ์ž…๋ ฅ์ด 10^2์ด๋ฏ€๋กœ ์ž‘์Œ
  • ์ญ‰ ํ›‘์–ด๋ณด๋ฉด์„œ ์ƒ‰์ด ๊ฐ™์€ ๊ณณ์„ memo์— ํ‘œ์‹œํ•˜๊ณ  ์•„๋‹Œ ๊ณณ์€ ๋‹ค์‹œ ์ฐพ๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ์ƒ‰์ด๋ผ๊ณ  ํ•˜๋ฉด 10^4๋งŒํผ ์ฐพ์•„๋ด์•ผํ•จ => ์‹œ๊ฐ„๋ณต์žก๋„ ๊ดœ์ฐฎ์Œ
  • ์ ๋ก ์ƒ‰์•ฝ์ธ ๊ฒฝ์šฐ๋Š” G๋ฅผ R๋กœ ๋ฐ”๊พผ mapRG๋ฅผ ์‚ฌ์šฉ

 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <queue>

using namespace std;

char map[101][101];
char mapRG[101][101];
int direction[4][2] = { {0,1}, {0,-1}, {1,0}, {-1, 0} };
int N;

int areaNum(char map[][101]) {
    int memo[101][101];
    fill(&memo[0][0], &memo[100][100], -1);

    int res = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (memo[i][j] != -1)
                continue;
            char color = map[i][j];
            queue<pair<int, int>> que;
            que.push(make_pair(i, j));
            while (!que.empty()) {
                pair<int, int> pos = que.front(); que.pop();
                for (int k = 0; k < 4; k++) {
                    int x = pos.first + direction[k][0];
                    int y = pos.second + direction[k][1];

                    if (x < 0 || y < 0 || x >= N || y >= N)
                        continue;
                    if (memo[x][y] != -1)
                        continue;
                    if (map[x][y] == color) {
                        memo[x][y] = 1;
                        que.push(make_pair(x, y));
                    }
                }
            }
            res++;
        }
    }
    return res;
}

int main() {
    cin >> N;
    for (int i = 0; i < N; i++) {
        string s; cin >> s;
        for (int j = 0; j < s.length(); j++) {
            char color = s[j];
            map[i][j] = color;
            if (color == 'G') {
                color = 'R';
            }
            mapRG[i][j] = color;
        }
    }

    cout << areaNum(map) << " " << areaNum(mapRG) << endl;
}

 

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•