ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/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);
                        }
                    }
                }
            }
        }
    }

    댓글

Designed by black7375.