반응형
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);
}
}
반응형
'코딩테스트 > Java' 카테고리의 다른 글
[JAVA] 2467 용액, 14921 용액합성하기, 2473 세 용액 (0) | 2022.03.17 |
---|---|
[JAVA] 수들의 합5 (0) | 2022.03.10 |
[JAVA] 백준 그대, 그머가 되어 (0) | 2022.02.25 |
[JAVA] 백준 끝나지 않는 파티(플로이드워셜) (0) | 2022.02.14 |
[JAVA] 백준 수강신청 (0) | 2022.02.09 |