코딩테스트/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); ​​​​} }

 

 

반응형