알고리즘/BJ
[BJ] 백준 10026 적록색약 (JAVA)
9_yoon
2022. 2. 23. 20:42
728x90
반응형
문제
https://www.acmicpc.net/problem/10026

풀이 방법
나는 DFS를 사용해서 풀었다. 아직 탐색을 안한 곳을 만나면 범위 카운트 변수에 1를 더해주고 DFS를 시작했다.
적록색약이 아닌 사람은 R, G ,B 모두 구별해서 탐색을 해줬고,
적록색약이라면 ch가 R or G일 때는 R or G 이면 탐색을 하도록 구현하였다.
제출 코드
import java.io.*;
public class BJ_10026_적록색약 {
static int[][] move= {{-1,0},{1,0},{0,-1},{0,1}};
static char[][] map ;
static boolean[][] visitedN;
static boolean[][] visitedG;
static int N;
public static void main(String[] args) throws NumberFormatException, 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++) {
map[i] = br.readLine().toCharArray();
}
int cntN = 0, cntG = 0;
visitedN = new boolean[N][N];
visitedG = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(!visitedN[i][j]) {
cntN++;
notDfs(map[i][j], i,j); //적록색약이 아닌 사람이 봤을때의 구역찾기
}
if(!visitedG[i][j]) {
cntG++;
greenDfs(map[i][j], i,j); //적록색약인 사람이 봤을때의 구역찾기
}
}
}
System.out.print(cntN+" "+cntG);
}
private static void notDfs(char ch, int i, int j) {
visitedN[i][j] = true;
for (int k = 0; k < 4; k++) {
int nr = i+move[k][0];
int nc = j+move[k][1];
if(nr >=0 && nr <N && nc>=0 && nc<N) {
if(!visitedN[nr][nc] && map[nr][nc] ==ch) { //현재 char과 동일하면 탐색
notDfs(ch, nr, nc);
}
}
}
}
private static void greenDfs(char ch, int i, int j) {
visitedG[i][j] = true;
for (int k = 0; k < 4; k++) {
int nr = i+move[k][0];
int nc = j+move[k][1];
if(nr >=0 && nr <N && nc>=0 && nc<N) {
if(!visitedG[nr][nc]) {
if(ch =='R' || ch =='G') { //현재 char이 R ,G 이면 R,G 인경우에 탐색
if(map[nr][nc] == 'R' || map[nr][nc]=='G') {
greenDfs(ch, nr, nc);
}
}else {
if( map[nr][nc] ==ch ) {
greenDfs(ch, nr, nc);
}
}
}
}
}
}
}
728x90
반응형