https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

  • 적록색약인 사람은 붉은색과 초록색을 같은 색으로 보기 때문에 기존에 입력했던 2차원 배열에서 'G' 값을 'R'로 변경하여 한번 더 BFS를 실행하였음

코드

#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

#define MAX 101
#define _X first
#define _Y second

char board[MAX][MAX];
bool visited[MAX][MAX];
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };

int N;
char color;
int rgbCount, colorBlindCount;

void Bfs(int x, int y, char color)
{
    queue<pair<int, int>> q;
    q.push({ x, y });
    visited[x][y] = true;

    while (!q.empty())
    {
        pair<int, int> cur = q.front();
        q.pop();

        for (int i = 0; i < 4; i++)
        {
            int nx = cur._X + dx[i];
            int ny = cur._Y + dy[i];

            if (board[nx][ny] != color || visited[nx][ny]) continue;
            if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;

            q.push({ nx, ny });
            visited[nx][ny] = true;
        }
    }
}

// bfs 실행하여 총 그림 영역의 수를 반환하는 함수이다.
int GetCount(char arr[][MAX])
{
    int cnt = 0;

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            color = arr[i][j];
            if (!visited[i][j] && arr[i][j] == color)
            {
                Bfs(i, j, color);
                cnt++;  
            }
        }
    }

    return cnt;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    // 크기 입력
    cin >> N;

    // 그림 입력
    for (int i = 0; i < N; i++)
    {
        string str;
        cin >> str;
        for (int j = 0; j < N; j++)
        {
            board[i][j] = str[j];
        }
    }

    // 적록색약이 아닌 사람이 보는 그림 영역의 수 구하기
    rgbCount = GetCount(board);

    // 방문 배열 초기화
    memset(visited, false, sizeof(visited));

    // 적록색약인 사람은 붉은색=초록색으로 인식하기 때문에
    // 초록색 그림이 위치한 곳을 붉은색 그림으로 변경
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if (board[i][j] == 'G')
                board[i][j] = 'R';
        }
    }

    // 적록색약인 사람이 보는 그림 영역의 수 구하기
    colorBlindCount = GetCount(board);

    // 출력
    cout << rgbCount << ' ' << colorBlindCount;
}

'C++ > BFS, DFS' 카테고리의 다른 글

[C++] 백준 5014 - 스타트 링크  (0) 2022.12.06
[c++] 백준 2468 - 안전 영역  (1) 2022.12.06
[C++] 백준 1303 - 전투  (0) 2022.11.30
[C++] 백준 1012 - 유기농 배추  (1) 2022.11.30
[C++] 백준 1260 - BFS와 DFS  (0) 2022.11.28

+ Recent posts