Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 016c975

Browse files
Create BOJ10026.md
1 parent 080a1cd commit 016c975

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

‎challenges/BOJ10026.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# 문제
2+
적록색약
3+
## 문제 원본
4+
문제의 원본은 [여기서](https://www.acmicpc.net/problem/10026) 확인하세요.
5+
6+
## 분류
7+
* DFS 구현
8+
9+
# 풀이
10+
11+
단순 DFS를 이용하여 영역의 수를 구한다.
12+
하지만 이문제에서는 적록색약의 시선에서 적색과 녹색의 구분이 없기 떄문에 정상인 경우와 적록색약인 경우의 시선에서 같은 색 인지 아닌지의 여부를 판별하는 함수를 이용한다.
13+
14+
15+
``` c++
16+
#include <iostream>
17+
#include <cstring>
18+
19+
using namespace std;
20+
21+
enum class Color {
22+
R = 'R', G = 'G', B = 'B'
23+
};
24+
25+
enum class Condition {
26+
NORMAL, WEAKNESS
27+
};
28+
29+
Color map[100][100];
30+
bool visited[100][100];
31+
32+
bool isSameColor(Color a, Color b, Condition condition) {
33+
if (condition == Condition::NORMAL) {
34+
return a == b;
35+
}
36+
else if (condition == Condition::WEAKNESS) {
37+
if ((a == b) || (a == Color::R && b == Color::G) || (a == Color::G && b == Color::R)) {
38+
return true;
39+
}
40+
else {
41+
return false;
42+
}
43+
}
44+
}
45+
46+
void dfs(int i, int j, int n, Condition condition) {
47+
visited[i][j] = true;
48+
49+
if ((j + 1) < n && !visited[i][j + 1] && isSameColor(map[i][j], map[i][j + 1], condition)) {
50+
dfs(i, j + 1, n, condition);
51+
}
52+
if ((j - 1) >= 0 && !visited[i][j - 1] && isSameColor(map[i][j], map[i][j - 1], condition)) {
53+
dfs(i, j - 1, n, condition);
54+
}
55+
if ((i + 1) < n && !visited[i + 1][j] && isSameColor(map[i][j], map[i + 1][j], condition)) {
56+
dfs(i + 1, j, n, condition);
57+
}
58+
if ((i - 1) >= 0 && !visited[i - 1][j] && isSameColor(map[i][j], map[i - 1][j], condition)) {
59+
dfs(i - 1, j, n, condition);
60+
}
61+
}
62+
63+
int main(void) {
64+
ios::sync_with_stdio(false);
65+
cin.tie(0); cout.tie(0);
66+
67+
int n;
68+
cin >> n;
69+
70+
char c;
71+
Color col;
72+
for (int i = 0; i < n; i++) {
73+
for (int j = 0; j < n; j++) {
74+
cin >> c;
75+
map[i][j] = (Color)c;
76+
}
77+
78+
}
79+
80+
int normalCount = 0;
81+
int weakCount = 0;
82+
83+
84+
for (int i = 0; i < n; i++) {
85+
for (int j = 0; j < n; j++) {
86+
if (!visited[i][j]) {
87+
dfs(i, j, n, Condition::NORMAL);
88+
normalCount++;
89+
}
90+
}
91+
}
92+
93+
memset(visited, false, sizeof(visited));
94+
95+
for (int i = 0; i < n; i++) {
96+
for (int j = 0; j < n; j++) {
97+
if (!visited[i][j]) {
98+
dfs(i, j, n, Condition::WEAKNESS);
99+
weakCount++;
100+
}
101+
}
102+
}
103+
104+
cout << normalCount << " " << weakCount;
105+
return 0;
106+
}
107+
```

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /