본문 바로가기
코딩테스트 준비/백준

[백준] 10026번 - 적록색약 [Java]

by mwzz6 2025. 1. 23.

https://www.acmicpc.net/problem/10026

 

[백준] 10026번 - 적록색약 [Java]
[백준] 10026번 - 적록색약 [Java]


1.  아이디어

 

적록색약인 사람은 R과 G를 동일하게 생각하고 적록색약이 아닌 사람은 다르게 생각하는 상황에서 구역의 개수를 구하는 문제로 BFS 알고리즘과 DFS 알고리즘을 활용하면 간단하게 해결할 수 있다.


2. 문제풀이

 

적록색약이 아닌 경우를 먼저 구하고 이후 원본에서 초록색을 전부 빨간색으로 바꿔서 다시 구하는 방식으로 구현했다.


3. 코드

 

import java.io.*;
import java.util.*;

public class Main_BFS {

    private static final int[] dr = {-1, 0, 1, 0};
    private static final int[] dc = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        char[][] map = new char[N][N];
        for (int i = 0; i < N; i++) {
            map[i] = br.readLine().toCharArray();
        }

        boolean[][] visited = new boolean[N][N];
        int cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (visited[i][j]) continue;

                bfs(i, j, N, map, visited, map[i][j]);
                cnt++;
            }
        }
        sb.append(cnt).append(" ");

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] == 'G') map[i][j] = 'R';
            }
        }

        visited = new boolean[N][N];
        cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (visited[i][j]) continue;

                bfs(i, j, N, map, visited, map[i][j]);
                cnt++;
            }
        }
        sb.append(cnt);

        bw.write(sb.toString());
        bw.flush();
    }

    private static void bfs(int r, int c, int N, char[][] map, boolean[][] visited, char color) {
        Queue<int[]> q = new ArrayDeque<>();
        q.add(new int[]{r, c});

        visited[r][c] = true;

        while (!q.isEmpty()) {
            int[] node = q.remove();

            for (int dir = 0; dir < 4; dir++) {
                int nr = node[0] + dr[dir];
                int nc = node[1] + dc[dir];

                if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
                if (map[nr][nc] != color || visited[nr][nc]) continue;

                q.add(new int[]{nr, nc});
                visited[nr][nc] = true;
            }
        }
    }

}
import java.io.*;

public class Main_DFS {

    private static final int[] dr = {-1, 0, 1, 0};
    private static final int[] dc = {0, 1, 0, -1};

    private static int N;
    private static char[][] map;
    private static boolean[][] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        N = Integer.parseInt(br.readLine());

        map = new char[N][N];
        for (int i = 0; i < N; i++) {
            map[i] = br.readLine().toCharArray();
        }

        visited = new boolean[N][N];
        int cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (visited[i][j]) continue;

                dfs(i, j, map[i][j]);
                cnt++;
            }
        }
        sb.append(cnt).append(" ");

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] == 'G') map[i][j] = 'R';
            }
        }

        visited = new boolean[N][N];
        cnt = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (visited[i][j]) continue;

                dfs(i, j, map[i][j]);
                cnt++;
            }
        }
        sb.append(cnt);

        bw.write(sb.toString());
        bw.flush();
    }

    private static void dfs(int r, int c, char color) {
        visited[r][c] = true;

        for (int dir = 0; dir < 4; dir++) {
            int nr = r + dr[dir];
            int nc = c + dc[dir];

            if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
            if (map[nr][nc] != color || visited[nr][nc]) continue;

            dfs(nr, nc, color);
        }
    }

}

4. 후기

 

- BFS

- DFS