본문 바로가기
Algorithm/BFS DFS

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

by 젊은오리 2023. 2. 28.
728x90

 

문제 링크 https://www.acmicpc.net/problem/10026

 

다른 문제와 비슷하게 DFS순회할 때마다 카운트를 증가하는 문제이다.

다만, 적록색약의 경우 R과 G를 같은 것으로 보기 때문에,

정상인의 경우 ->  R-R, G-G, B-B와 같이 같은 것을 만났을 때만 DFS순회를 하도록 하고, 

적록색약의 경우 -> 정상인의 경우에 R-G, G-R 이 두가지 경우를 추가해주면 된다. 

 

Code

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
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
const int MAX = 101;
using namespace std;
int n;
vector<string> arr;
bool visited[MAX][MAX];
int dir[4][2= { {-1,0},{1,0},{0,1},{0,-1} };
int cnt1, cnt2;
 
void dfs(int x, int y, bool normal) {
    for (int i = 0; i < 4; i++) {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if (visited[nx][ny])
            continue;
        if (nx < 0 || nx >= n || ny < 0 || ny >= n)
            continue;
 
        if (normal == true) { //정상인의 경우 색이 같으면 DFS
            if (arr[nx][ny] == arr[x][y]) {
                visited[nx][ny] = true;
                dfs(nx, ny, normal);
            }
        }
        else { //적록색약의 경우 R와 G가 만나도 DFS
            if ((arr[x][y] == 'R' && arr[nx][ny] == 'R'||
                (arr[x][y] == 'R' && arr[nx][ny] == 'G'||
                (arr[x][y] == 'G' && arr[nx][ny] == 'R'||
                (arr[x][y] == 'G' && arr[nx][ny] == 'G'||
                (arr[x][y] == 'B' && arr[nx][ny] == 'B')) {
 
                visited[nx][ny] = true;
                dfs(nx, ny, normal);
            }
        }
    }
}
int main()
{
    cin >> n;
    arr.resize(n + 1);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    //정상인
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (!visited[i][j]) {
                visited[i][j] = true;
                dfs(i, j, true);
                cnt1++;
            }
        }
    }
    memset(visited, falsesizeof(visited));
 
    //적록색약
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (!visited[i][j]) {
                visited[i][j] = true;
                dfs(i, j, false);
                cnt2++;
            }
        }
    }
    cout << cnt1 << " " << cnt2;
}
 
cs
728x90

'Algorithm > BFS DFS' 카테고리의 다른 글

[백준] 2468 안전영역 c++  (0) 2023.03.02
[백준] 4963 섬의 개수 c++  (1) 2023.03.01
[백준] 11724 연결 요소의 개수 c++  (0) 2023.02.28
[백준] 1012 유기농 배추 c++  (0) 2023.02.27
[백준] 2667 단지번호붙이기 c++  (0) 2023.02.27

댓글