내 코드
#include <iostream>
#include <utility>
#include <queue>
using namespace std;
char field[101][101];
bool isvisit[101][101];
bool isvisit2[101][101];
int xdis[4] = {1,0,-1,0};
int ydis[4] = {0,1,0,-1};
int r,g,k;
int x,y;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
int n; cin >> n;
for(int i =0;i<n;i++)
{
for(int j =0;j<n;j++)
{
cin >> field[i][j];
}
}
queue <pair<int,int>> q;
queue <pair<int,int>> q2;
for(int a = 0; a<n;a++)
{
for(int b = 0; b<n;b++)
{
if(field[a][b] == 'R' && isvisit[a][b] == false)
{
r++;
q.push({a,b});
isvisit[a][b] = true;
while(!q.empty())
{
pair<int,int> p = q.front(); q.pop();
for(int i =0;i<4;i++)
{
int curx = p.first + xdis[i];
int cury = p.second + ydis[i];
if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
if(isvisit[curx][cury] || field[curx][cury] != 'R') continue;
q.push({curx,cury});
isvisit[curx][cury] = true;
}
}
}
else if(field[a][b] == 'G' && isvisit[a][b] == false)
{
g++;
q.push({a,b});
isvisit[a][b] = true;
while(!q.empty())
{
pair<int,int> p = q.front(); q.pop();
for(int i =0;i<4;i++)
{
int curx = p.first + xdis[i];
int cury = p.second + ydis[i];
if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
if(isvisit[curx][cury] || field[curx][cury] != 'G') continue;
q.push({curx,cury});
isvisit[curx][cury] = true;
}
}
}
else if(field[a][b] == 'B' && isvisit[a][b] == false)
{
k++;
q.push({a,b});
isvisit[a][b] = true;
while(!q.empty())
{
pair<int,int> p = q.front(); q.pop();
for(int i =0;i<4;i++)
{
int curx = p.first + xdis[i];
int cury = p.second + ydis[i];
if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
if(isvisit[curx][cury] || field[curx][cury] != 'B') continue;
q.push({curx,cury});
isvisit[curx][cury] = true;
}
}
}
}
}
for(int a = 0;a<n;a++)
{
for(int b= 0; b<n;b++)
{
if((field[a][b] == 'R' || field[a][b] == 'G') && isvisit2[a][b] == false)
{
x++;
q2.push({a,b});
isvisit2[a][b] = true;
while(!q2.empty())
{
pair<int,int> p = q2.front(); q2.pop();
for(int i =0;i<4;i++)
{
int curx = p.first + xdis[i];
int cury = p.second + ydis[i];
if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
if(isvisit2[curx][cury] || field[curx][cury] == 'B') continue;
q2.push({curx,cury});
isvisit2[curx][cury] = true;
}
}
}
else if(field[a][b] == 'B' && isvisit2[a][b] == false)
{
y++;
q2.push({a,b});
isvisit2[a][b] = true;
while(!q2.empty())
{
pair<int,int> p = q2.front(); q2.pop();
for(int i =0;i<4;i++)
{
int curx = p.first + xdis[i];
int cury = p.second + ydis[i];
if(curx < 0||curx >=n||cury < 0 || cury>=n) continue;
if(isvisit2[curx][cury] || field[curx][cury] != 'B') continue;
q2.push({curx,cury});
isvisit2[curx][cury] = true;
}
}
}
}
}
cout << r+g+k << ' ' << x+y;
}
- 적록색약을 가진 사람은 빨간색과 녹색을 동일한 색으로 취급한다. 따라서 적록색약을 가진사람과 갖지 않은 사람을 구별하여
visit배열
을 따로 선언한다!
- 각각의 범위에
bfs
를 돌때마다 선언한 변수에 +1
을 하여 합
을 출력하면 해결!
정답
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
char board[101][101];
bool vis[101][101];
int n;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
void bfs(int i, int j) {
queue<pair<int, int>> Q;
Q.push({ i,j });
vis[i][j] = 1;
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 (vis[nx][ny] == 1 || board[i][j] != board[nx][ny]) continue;
vis[nx][ny] = 1;
Q.push({ nx,ny });
}
}
}
int area(){
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!vis[i][j]) {
cnt++;
bfs(i, j);
}
}
}
return cnt;
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> board[i][j];
}
}
int not_g = area();
for(int i = 0; i < n; i++)
fill(vis[i], vis[i]+n, false);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 'G')
board[i][j] = 'R';
}
}
int is_g = area();
cout << not_g << " " << is_g;
return 0;
}
변수
를 따로 선언하지 않고 함수의 리턴값
이용하고 있다.
- 또한,
r``g``b
배열을 적록색약인 사람의 경우 r
을 g
로 바꿔 단순하게 처리하고 있다.. 훨씬 더 깔끔하다.