문제 출처 : https://www.acmicpc.net/problem/10026
문제

설명
R, G, B 군집들이 몇 개가 있는지 알아내기 위해 dfs를 구현했습니다.
그 다음에 기존 pic에서 R인 부분을 모두 G로 바꿔줌으로써 적록색약 환자 버전을 새로 만들었습니다. 그 후, 동일한 과정을 통해 G와 B의 군집들이 총 몇개 있는지 세어주는 방법을 통해 문제를 해결했습니다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BOJ10026_RGB {
static char[][] pic;
static boolean[][] visited;
static int N, R, G, B;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
pic = new char[N][N]; //일반 그림
visited = new boolean[N][N];
for(int i=0; i<N; i++) {
String s = br.readLine();
pic[i]=s.toCharArray();
} //입력 완료
int cnt=0;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(!visited[i][j]) {
cnt++;
dfs(i, j, pic[i][j]);
}
}
}
System.out.print(cnt + " ");
//적록색약 환자 버전
makePatientPic();
//초기화
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]) {
cnt++;
dfs(i, j, pic[i][j]);
}
}
}
System.out.print(cnt);
}
private static void makePatientPic() {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(pic[i][j] == 'R')
pic[i][j]='G';
}
}
}
private static void dfs(int x, int y, char color) {
visited[x][y]=true;
for(int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=0 && nx<N && ny>=0 && ny<N && pic[nx][ny]==color && !visited[nx][ny]) {
//범위 안에 있고 색이 같으며(같은 구역이라면) 아직 방문하지 않았다면
dfs(nx, ny, color);
}
}
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준][JAVA] 1463 - 1로 만들기 (0) | 2021.10.25 |
---|---|
[백준][JAVA] 1149번 - RGB거리 (0) | 2021.10.21 |
[백준][JAVA] 12927 - 배수 스위치 (0) | 2021.10.17 |
[백준][JAVA] 2559 - 수열 (0) | 2021.10.10 |
[백준][JAVA] 2304 - 창고 다각형 (0) | 2021.10.10 |