반응형
문제
풀이
주어진 조건에 따라 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[] = { 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0 };
void BFS(int x, int y, bool color)
{
if (visited[y][x])
return;
if (color)
colorCnt++;
else
cnt++;
visited[y][x] = true;
queue<pair<int, int>> 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, false, sizeof(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 |