-
[백준/JAVA] 10026 적록색약ETC/Algorithm 2023. 5. 25. 02:31
조심!
- 비색약인과 색약인이 보는 지도는 같지만, 인식하는 내용은 다르다. -> 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); } } } } } }