문제
입출력
문제 요약
적록색약은 빨강(R), 초록(G)를 차이를 구분하지 못한다고 한다. 즉 적록색약이 봤을 때는 R과 G를 동일선상에 놓아야한다.
출력 값들을 보면 적록색약이 아닌 사람이 봤을 때의 구역 개수, 적록색약인 사람이 봤을 때 구역의 수를 출력해야한다.
코드 구현 순서는
1. 적록색약이 아닌 사람이 봤을 때의 dfs 실행
2. 적록색약의 dfs를 하기 전 G -> R 로 바꾸기
3. visited 배열 false로 다시 초기화
4. 적록색약의 dfs 실행
코드
#include <iostream>
#include <cstring>
using namespace std;
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
char map[100][100];
bool visited[100][100];
int N;
int cnt = 0;
int no_cnt = 0;
string str;
void dfs(int x, int y) {
visited[x][y] = true;
char color = map[x][y];
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < N && ny < N && nx >= 0 && ny >= 0) {
if (map[nx][ny] == color && !visited[nx][ny]) {
dfs(nx, ny);
}
}
}
}
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> str;
for (int j = 0; j < N; j++) {
map[i][j] = str[j];
}
}
memset(visited, false, sizeof(visited));
//적록색약이 아닌 dfs
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j]) {
dfs(i, j);
no_cnt++;
}
}
}
//적록색약 dfs
// G -> R로 바꾸기
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 'G') {
map[i][j] = 'R';
}
}
}
memset(visited, false, sizeof(visited));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j]) {
dfs(i, j);
cnt++;
}
}
}
cout << no_cnt << " " << cnt;
}
'📖Algorithm > DFS & BFS' 카테고리의 다른 글
C++ [Algorithm] - 백준 11724 연결 요소의 개수 (0) | 2024.08.05 |
---|---|
C++ [Algorithm] - 백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2024.08.02 |
C++ [Algorithm] - 백준 4963 섬의 개수 (0) | 2024.08.02 |
C++ [Algorithm] - 백준 2667 단지번호붙이기 (0) | 2024.08.02 |
C++ [Algorithm] - 백준 1520 내리막길 (0) | 2024.08.02 |