조심!
- 비색약인과 색약인이 보는 지도는 같지만, 인식하는 내용은 다르다. -> BFS 알고리즘의 조건이 다르다
- 지도의 R과 G는 같이 있으면 동일한 값으로 취급하지만, 따로 있을 경우 다른 값으로 인식한다.
풀이
- DFS를 사용하여 풀었다.
- 비색약인과 색약인이 인식하는 내용이 다르므로, 알고리즘의 visited의 값은 차이를 갖는다. 고로 변수를 따로 사용한다.
- 색약인의 경우 다음 좌표의 색과 현재 좌표의 색이 서로 R과G일 때 이동 가능하다.
제출 코드
import java.io.*;
class Main {
static int N;
static char[][] map;
static boolean[][] normalVisited;
static boolean[][] blindVisited;
static int[] opsX = {-1, 1, 0, 0};
static int[] opsY = {0, 0, -1, 1};
static int[] count = new int[2];
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
map = new char[N][N];
for (int i = 0; i < N; i++) {
String line = br.readLine();
for (int j = 0; j < N; j++) {
map[i][j] = line.charAt(j);
}
}
normalVisited = new boolean[N][N];
blindVisited = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!normalVisited[i][j]) {
normalDfs(i, j);
count[0]++;
}
if (!blindVisited[i][j]) {
blindDfs(i, j);
count[1]++;
}
}
}
bw.write((count[0]) + " ");
bw.write(String.valueOf(count[1]));
bw.flush();
}
public static void normalDfs(int x, int y) {
normalVisited[x][y] = true;
for (int i = 0; i < 4; i++) {
int newX = x + opsX[i];
int newY = y + opsY[i];
if (-1 < newX && newX < N && -1 < newY && newY < N) {
if (map[newX][newY] == map[x][y] && !normalVisited[newX][newY]) {
normalDfs(newX, newY);
}
}
}
}
public static void blindDfs(int x, int y) {
blindVisited[x][y] = true;
for (int i = 0; i < 4; i++) {
int newX = x + opsX[i];
int newY = y + opsY[i];
if (-1 < newX && newX < N && -1 < newY && newY < N) {
if ( (map[newX][newY] == 'G' && map[x][y] == 'R') ||
(map[newX][newY] == 'R' && map[x][y] == 'G') ||
(map[newX][newY] == map[x][y]) ) {
if (!blindVisited[newX][newY]) {
blindDfs(newX, newY);
}
}
}
}
}
}