알고리즘/백준

[백준 10026] 적록색약 C++

겜도리도리 2022. 10. 6. 21:32
반응형

문제

백준 10026 적록색약 C++

 

10026번: 적록색약

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

www.acmicpc.net

풀이

주어진 조건에 따라 DFS나 BFS를 활용하여 그래프를 탐색해주면 된다.

색약인 경우와 색약이 아닌 경우를 color로 구분하여, 색약이 아닌 경우에는 색깔이 같을 때만 queue에 push해주고

색약인 경우에는 빨강과 초록의 구분이 없게 하여 queue에 push 한다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include<iostream>
#include<memory.h>
#include<vector>
#include<queue>
using namespace std;
 
char map[101][101];
bool visited[101][101];
int N;
// 색맹이 보는 영역
int colorCnt;
// 색맹이 아닌 사람이 보는 영역
int cnt;
 
int dx[] = { 00-11 };
int dy[] = { -1100 };
 
void BFS(int x, int y, bool color)
{
    if (visited[y][x])
        return;
        
    if (color)
        colorCnt++;
    else
        cnt++;
 
    visited[y][x] = true;
    queue<pair<intint>> q;
    q.push({ x, y });
 
    while (!q.empty())
    {
        int curX = q.front().first;
        int curY = q.front().second;
        char curC = map[curY][curX];
        q.pop();
 
        for (int i = 0; i < 4; i++)
        {
            int nextX = curX + dx[i];
            int nextY = curY + dy[i];
 
            // 영역을 벗어나지 않고, 방문하지 않은 경우에
            if (nextX >= 0 && nextX < N && nextY >= 0 && nextY < N && !visited[nextY][nextX])
            {
                char nextC = map[nextY][nextX];
 
                // 색깔이 같은 경우만 queue에 push
                if (nextC == curC || (color == true && curC != 'B' && nextC != 'B'))
                {
                    visited[nextY][nextX] = true;
                    q.push({ nextX, nextY });
                }
            }
        }
    }
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
 
    cin >> N;
 
    string input;
    for (int i = 0; i < N; i++)
    {
        cin >> input;
        for (int j = 0; j < input.size(); j++)
        {
            map[i][j] = input[j];
        }
    }
 
    // 색맹이 아닌 사람이 보는 영역 세기
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            BFS(j, i, false);
        }
    }
 
    memset(visited, falsesizeof(visited));
 
    // 색맹인 사람이 보는 영역 세기
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            BFS(j, i, true);
        }
    }
 
    cout << cnt << ' ' << colorCnt;
 
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 4883] 삼각 그래프 C++  (1) 2022.12.22
[백준 2240] 자두나무 C++  (0) 2022.11.06
[백준 11404] 플로이드 C++  (0) 2022.09.27
[백준 11725] 트리의 부모 찾기 C++  (0) 2022.09.20
[백준 1647] 도시 분할 계획 C++  (0) 2022.08.12