1
+ #include < iostream>
2
+ #include < vector>
3
+ #include < queue>
4
+
5
+ using namespace std ;
6
+ typedef pair<int , int > ci;
7
+
8
+ void greenToRed (int n, vector<vector<char >> &board) {
9
+ for (int i = 0 ; i < n; i++) {
10
+ for (int j = 0 ; j < n; j++) {
11
+ if (board[i][j] == ' G' ) {
12
+ board[i][j] = ' R' ;
13
+ }
14
+ }
15
+ }
16
+ }
17
+
18
+ void bfs (int n, int r, int c, vector<vector<bool >> &visited, vector<vector<char >> &board) {
19
+ // 상, 하, 좌, 우
20
+ int dr[4 ] = {-1 , 1 , 0 , 0 };
21
+ int dc[4 ] = {0 , 0 , -1 , 1 };
22
+
23
+ queue<ci> q;
24
+
25
+ // 큐 초기화
26
+ q.push ({r, c});
27
+ visited[r][c] = true ;
28
+ while (!q.empty ()) {
29
+ int cr = q.front ().first ;
30
+ int cc = q.front ().second ;
31
+ q.pop ();
32
+
33
+ for (int i = 0 ; i < 4 ; i++) {
34
+ int nr = cr + dr[i];
35
+ int nc = cc + dc[i];
36
+ if (nr < 0 || nr >= n || nc < 0 || nc >= n || visited[nr][nc]) {
37
+ continue ;
38
+ }
39
+ if (board[nr][nc] != board[cr][cc]) {
40
+ continue ;
41
+ }
42
+ q.push ({nr, nc});
43
+ visited[nr][nc] = true ;
44
+ }
45
+ }
46
+ }
47
+
48
+ int countArea (int n, vector<vector<char >> &board) {
49
+ vector<vector<bool >> visited (n, vector<bool >(n, false ));
50
+ int area = 0 ;
51
+
52
+ for (int i = 0 ; i < n; i++) {
53
+ for (int j = 0 ; j < n; j++) {
54
+ if (visited[i][j]) {
55
+ continue ;
56
+ }
57
+ bfs (n, i, j, visited, board);
58
+ area++;
59
+ }
60
+ }
61
+ return area;
62
+ }
63
+
64
+ /* *
65
+ * [적록색약]
66
+ *
67
+ * 그림의 색을 기준으로 구역을 나누는 문제
68
+ * 1. 적록색약이 아닌 사람 기준으로 구역을 나눈다.
69
+ * 2. 그림의 초록을 모두 빨강으로 바꾼 후, 적록색약인 사람 기준으로 구역을 나눈다.
70
+ */
71
+
72
+ int main () {
73
+ int n;
74
+ string s;
75
+
76
+ // 입력
77
+ cin >> n;
78
+ vector<vector<char >> board (n, vector<char >(n, ' ' ));
79
+ for (int i = 0 ; i < n; i++) {
80
+ cin >> s;
81
+ for (int j = 0 ; j < n; j++) {
82
+ board[i][j] = s[j];
83
+ }
84
+ }
85
+
86
+ // 연산 & 출력
87
+ cout << countArea (n, board) << ' ' ;
88
+ greenToRed (n, board);
89
+ cout << countArea (n, board);
90
+ return 0 ;
91
+ }
0 commit comments