문제 풀이/C#
[10026] - 적록색약
Chamber
2022. 10. 5. 01:05
https://www.acmicpc.net/problem/10026
10026번: 적록색약
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)
www.acmicpc.net
접근 방식
bfs를 하나만 구현하고, 색약이 있으니 녹색과 적색을 동일 시 하려 하였지만 조건이 생각이 안나서 그냥 정상인과 색약을 구분해서 bfs탐색을 2번 하였다.
- 색약 그래프를 만들 때 R을 G로 바꾸거나 G를 R로 바꾸면 출력값이 이상해 둘다 A로 바꾸어 주었다.
문제 풀이
- 정상인 그래프는 그대로 입력, 색약 그래프는 G나 R이 들어오면 A로 바꾸어서 입력
- 토마토 문제와 마찬가지로 조이스틱 형태로 bfs 탐색, 방문을 하지 않았다면 그 구역은 아직 bfs탐색을 안한 것이므로 카운트 +1 (bfs탐색 시 연결된 색이 같은 부분은 다 탐색이 되기 때문)
- 정상인 bfs와 색약 bfs의 결과 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _10026
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
char[,] paint = new char[n,n];
char[,] b_paint = new char[n,n];
bool[,] visit = new bool[n,n]; //정상인 방문했는지
bool[,] b_visit = new bool[n,n]; //색약 방문 표시
for (int i = 0; i < n; i++)
{
string s = Console.ReadLine();
for (int j = 0; j < n; j++)
{
paint[i, j] = s[j];
//색약을 위한 그래프
if (s[j] == 'R' || s[j] =='G')
b_paint[i, j] = 'A';
}
}
//상하 좌우
int[] updown = { -1, 1, 0, 0 };
int[] leftright = { 0, 0, -1, 1};
int normal = 0; //정상인
int blind = 0; //적록색약
Queue<(int,int)> que = new Queue<(int,int)>();
Queue<(int,int)> blind_que = new Queue<(int,int)>();
char rgb;
char blind_rgb;
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
//정상인
rgb = paint[i, j];
if (!visit[i, j])
{
visit[i, j] = true;
que.Enqueue((i,j));
normal++;
}
while (que.Count > 0)
{
(int, int) point = que.Dequeue();
for(int k = 0; k<4; k++)
{
int y = point.Item1 + updown[k];
int x = point.Item2 + leftright[k];
//범위 안
if ((y<n && y>=0) &&(x<n && x >= 0))
{
if (paint[y,x] == rgb && !visit[y, x])
{
visit[y, x] = true;
que.Enqueue((y,x));
}
}
}
}
//적록 색맥
blind_rgb = b_paint[i, j];
if (!b_visit[i, j])
{
b_visit[i, j] = true;
blind_que.Enqueue((i, j));
blind++;
}
while (blind_que.Count > 0)
{
(int, int) point = blind_que.Dequeue();
for (int k = 0; k < 4; k++)
{
int y = point.Item1 + updown[k];
int x = point.Item2 + leftright[k];
//범위 안
if ((y < n && y >= 0) && (x < n && x >= 0))
{
if (b_paint[y, x] == blind_rgb && !b_visit[y, x])
{
b_visit[y, x] = true;
blind_que.Enqueue((y, x));
}
}
}
}
}
}
Console.WriteLine($"{normal}\n{blind}");
}
}
}