BOJ 10026. ์ ๋ก์์ฝ
๐โโ๏ธ[Gold V] ์ ๋ก์์ฝ - 10026
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2200 KB, ์๊ฐ: 0 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊น์ด ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์
์ ์ถ ์ผ์
2024๋ 1์ 5์ผ 00:08:32
๋ฌธ์ ์ค๋ช
์ ๋ก์์ฝ์ ๋นจ๊ฐ์๊ณผ ์ด๋ก์์ ์ฐจ์ด๋ฅผ ๊ฑฐ์ ๋๋ผ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์, ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ์ ์๋ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ๊ณผ๋ ์ข ๋ค๋ฅผ ์ ์๋ค.
ํฌ๊ธฐ๊ฐ NรN์ธ ๊ทธ๋ฆฌ๋์ ๊ฐ ์นธ์ R(๋นจ๊ฐ), G(์ด๋ก), B(ํ๋) ์ค ํ๋๋ฅผ ์์น ํ ๊ทธ๋ฆผ์ด ์๋ค. ๊ทธ๋ฆผ์ ๋ช ๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋์ด์ ธ ์๋๋ฐ, ๊ตฌ์ญ์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋, ๊ฐ์ ์์์ด ์ํ์ข์ฐ๋ก ์ธ์ ํด ์๋ ๊ฒฝ์ฐ์ ๋ ๊ธ์๋ ๊ฐ์ ๊ตฌ์ญ์ ์ํ๋ค. (์์์ ์ฐจ์ด๋ฅผ ๊ฑฐ์ ๋๋ผ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ์์์ด๋ผ ํ๋ค)
์๋ฅผ ๋ค์ด, ๊ทธ๋ฆผ์ด ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์
RRRBB GGBBB BBBRR BBRRR RRRRR
์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ด ๋ดค์ ๋ ๊ตฌ์ญ์ ์๋ ์ด 4๊ฐ์ด๋ค. (๋นจ๊ฐ 2, ํ๋ 1, ์ด๋ก 1) ํ์ง๋ง, ์ ๋ก์์ฝ์ธ ์ฌ๋์ ๊ตฌ์ญ์ 3๊ฐ ๋ณผ ์ ์๋ค. (๋นจ๊ฐ-์ด๋ก 2, ํ๋ 1)
๊ทธ๋ฆผ์ด ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ก์ ๋, ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ดค์ ๋์ ์๋ ์ฌ๋์ด ๋ดค์ ๋ ๊ตฌ์ญ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 100)
๋์งธ ์ค๋ถํฐ N๊ฐ ์ค์๋ ๊ทธ๋ฆผ์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ด ๋ดค์ ๋์ ๊ตฌ์ญ์ ๊ฐ์์ ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ดค์ ๋์ ๊ตฌ์ญ์ ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ถ๋ ฅํ๋ค.
๐ํ์ด
BFS๋ฅผ ๋ ๊ฐ ๋ง๋ค์ด์ ํ๋๋ R,G,B๋ฅผ ๊ตฌ๋ถํ BFS, ๋ค๋ฅธ ํ๋๋ R,G์ธํธ B๋ฐ๋ก ๊ตฌ๋ถํ๋ BFS๋ฅผ ๋ง๋ค์ด์ ํ์๋ค.
// R,G,B ๋ค ๊ตฌ๋ถํ๋ ๋ฒ์
queue<pair<int, int>> q;
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void BFS(int y, int x)
{
if (discovered[y][x])
return;
char ch = board[y][x];
if (ch == 'R')
r++;
else if (ch == 'G')
g++;
else
b++;
q.push({ y, x });
discovered[y][x] = 1;
while (q.empty() == false)
{
pair<int, int> here = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > n)
continue;
if (discovered[ny][nx] == 1)
continue;
if (board[ny][nx] != ch) // ๋ค ๊ตฌ๋ถํ๋ ๋ฒ์ ์ด๋๊น ๋ค๋ฅด๋ฉด ๋ฐ๋ก continue
continue;
discovered[ny][nx] = 1;
q.push({ ny, nx });
}
}
}
// R,G๋ B๋ก ๊ตฌ๋ถํ๋ ๋ฒ์
void BFS2(int y, int x)
{
if (discovered[y][x])
return;
char ch = board[y][x];
if (ch == 'R')
r++;
else if (ch == 'B')
b++;
else
g++;
q.push({ y, x });
discovered[y][x] = 1;
while (q.empty() == false)
{
pair<int, int> here = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > n)
continue;
if (discovered[ny][nx] == 1)
continue;
if (ch == 'B' && board[ny][nx] != ch) // B์ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ๊ฑฐ ๋ง๋๋ฉด continue
continue;
if (ch == 'R' && board[ny][nx] == 'B') // R, G๋ B๋ง๋๋ฉด continue;
continue;
if (ch == 'G' && board[ny][nx] == 'B')
continue;
discovered[ny][nx] = 1;
q.push({ ny, nx });
}
}
}
์ด๋ ๊ฒ ํ๊ณ r,g,b์ ๊ฐ์๋ฅผ ์ธ์ด์ ๋ต์ ๊ตฌํ๋ค.
void solve()
{
setting();
for (int y = 1; y <= n; ++y)
{
for (int x = 1; x <= n; ++x)
{
BFS(y, x);
}
}
//cout << r << " " << g << " " << b << '\n';
cout << r + g + b << " ";
memset(discovered, 0, sizeof(discovered));
r = g = b = 0;
for (int y = 1; y <= n; ++y)
{
for (int x = 1; x <= n; ++x)
{
BFS2(y, x);
}
}
//cout << r << " " << g << " " << b;
cout << r + g + b;
}
๋ชจ๋ ์ ์ ์ ์ํํ๋ฉด์ BFS๋ฅผ ๋๋ ค์ผํ๋ค.
ํ๋ฒ ๋ค ๋๋ฆฌ๋ฉด ์ด๊ธฐํ๋ฅผ ํด์ค์ผ ๊ฐ์ด ์ค๋ณต์ด ์๋๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
vector<vector<char>> board;
int discovered[101][101];
int n, r = 0, g = 0, b = 0;
void setting()
{
cin >> n;
board = vector<vector<char>>(n + 1, vector<char>(n + 1));
string str;
for (int y = 1; y <= n; ++y)
{
cin >> str;
for (int x = 1; x <= n; ++x)
{
board[y][x] = str[x - 1];
}
}
}
queue<pair<int, int>> q;
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void BFS(int y, int x)
{
if (discovered[y][x])
return;
char ch = board[y][x];
if (ch == 'R')
r++;
else if (ch == 'G')
g++;
else
b++;
q.push({ y, x });
discovered[y][x] = 1;
while (q.empty() == false)
{
pair<int, int> here = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > n)
continue;
if (discovered[ny][nx] == 1)
continue;
if (board[ny][nx] != ch)
continue;
discovered[ny][nx] = 1;
q.push({ ny, nx });
}
}
}
void BFS2(int y, int x)
{
if (discovered[y][x])
return;
char ch = board[y][x];
if (ch == 'R')
r++;
else if (ch == 'B')
b++;
else
g++;
q.push({ y, x });
discovered[y][x] = 1;
while (q.empty() == false)
{
pair<int, int> here = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > n || nx > n)
continue;
if (discovered[ny][nx] == 1)
continue;
if (ch == 'B' && board[ny][nx] != ch)
continue;
if (ch == 'R' && board[ny][nx] == 'B')
continue;
if (ch == 'G' && board[ny][nx] == 'B')
continue;
discovered[ny][nx] = 1;
q.push({ ny, nx });
}
}
}
void solve()
{
setting();
for (int y = 1; y <= n; ++y)
{
for (int x = 1; x <= n; ++x)
{
BFS(y, x);
}
}
//cout << r << " " << g << " " << b << '\n';
cout << r + g + b << " ";
memset(discovered, 0, sizeof(discovered));
r = g = b = 0;
for (int y = 1; y <= n; ++y)
{
for (int x = 1; x <= n; ++x)
{
BFS2(y, x);
}
}
//cout << r << " " << g << " " << b;
cout << r + g + b;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}