문제 풀이/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}");
        }
    }
}