코딩테스트/Java

[JAVA] 백준 적록색약

SK_MOUSE 2022. 2. 26. 17:03
반응형

dfs 방식으로 접근하면 풀리는 문제이다.

적록색약인 사람일때의 탐색용 배열은 R과 G를 한쪽으로 통일 시켜서 배열을 저장해서 dfs해주면 된다.(replaceAll 사용)

 

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

public class Main {
    static int N;
    static char[][] org, rg;
    static boolean[][] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());

        org = new char[N][N];
        rg = new char[N][N];
        visited = new boolean[N][N];
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            String rgs = s.replaceAll("G", "R");
            for (int j = 0; j < N; j++) {
                org[i][j] = s.charAt(j);
                rg[i][j] = rgs.charAt(j);
            }
        }

        int first = dfs(org);
        visited = new boolean[N][N];
        int second = dfs(rg);
        System.out.println(first + " " +second);
    }

    private static int dfs(char[][] arr) {
        int count = 0;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (!visited[i][j]) {
                    go(i, j, arr[i][j],arr);
                    count++;
                }
            }
        }

        return count;
    }

    private static void go(int r, int c, char alpha,char[][] arr) {
        int[] dr = {-1, 0, 1, 0};
        int[] dc = {0, -1, 0, 1};
        visited[r][c]=true;
        for (int d = 0; d <4; d++) {
            int nr = r+dr[d];
            int nc = c+dc[d];

            if(boundaryCheck(nr,nc)&&!visited[nr][nc]&&arr[nr][nc]==alpha) {
                visited[nr][nc]=true;
                go(nr,nc,alpha, arr);
            }
        }
        return;
    }

    private static boolean boundaryCheck(int nr, int nc) {
        return (nr>=0)&&(nr<N)&&(nc>=0)&&(nc<N);
    }


}

 

 

반응형