문제설명
크기가 N*N인 그리드를 R, G, B로 칠했을 때 일반인이 보는 구역의 개수와 적록색약이 보는 구역의 개수를 출력하는 문제입니다.(일반인이 볼때는 같은 색일때만 같은 구역이고 적록색약이 볼때는 R,G는 같은 구역 B만 다른 구역입니다.)
작동 순서
1. 그리드의 크기 N을 입력받습니다.
2. DFS를 이용하여 맵 전체를 탐색합니다. 인접한 칸이 현재 칸과 색이 같고 방문한적이 없을 경우 방문합니다.
3. 메인함수에서 새롭게 출발한 탐색들의 개수는 일반인이 볼 때의 구역의 개수이므로 출력해줍니다.
4. 적록색약이 볼때의 구역은 DFS에서 R과 G는 같은구역으로 처리해주고 B만 같은 구역으로 처리해주는 것을 제외하면 기존 DFS와 동일합니다.
5. 적록색약이 보는 구역을 탐색하기전에 visited와 count를 초기화해줍니다.
6. DFS_RG를 이용해 맵전체를 탐색하고 메인함수에서 새롭게 출발한 탐색들의 개수를 출력해줍니다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class 백준_10026번_적록색약 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int[] moveX={0, 0, -1, 1};
static int[] moveY={-1, 1, 0, 0};
static void inputMap(String[][] map) throws IOException {
String[] input;
for(int i=0;i< map.length;i++){
input=br.readLine().split("");
for(int j=0;j< map.length;j++){
map[i][j]=input[j];
}
}
}
static void DFS(int x, int y, String[][] map, int[][] visited){
visited[x][y]=1;
for(int i=0;i<4;i++) {
if(x+moveX[i]>=0 && y+moveY[i]>=0 && x+moveX[i]< map.length && y+moveY[i]< map.length){
if (map[x][y].equals(map[x + moveX[i]][y + moveY[i]]) && visited[x+moveX[i]][y+moveY[i]]==0) DFS(x+moveX[i],y+moveY[i],map,visited);
}
}
}
static void DFS_RG(int x, int y, String[][] map, int[][] visited){
visited[x][y]=1;
for(int i=0;i<4;i++) {
if(x+moveX[i]>=0 && y+moveY[i]>=0 && x+moveX[i]< map.length && y+moveY[i]< map.length){
if (map[x][y].equals("R") || map[x][y].equals("G")){
if ((map[x+moveX[i]][y+moveY[i]].equals("R") || map[x+moveX[i]][y+moveY[i]].equals("G")) && visited[x+moveX[i]][y+moveY[i]]==0) DFS_RG(x+moveX[i],y+moveY[i],map,visited);
}
else{
if (map[x+moveX[i]][y+moveY[i]].equals("B") && visited[x+moveX[i]][y+moveY[i]]==0) DFS(x+moveX[i],y+moveY[i],map,visited);
}
}
}
}
public static void main(String[] args) throws IOException {
int count=0;
int N = Integer.parseInt(br.readLine());
String[][] map=new String[N][N];
int[][] visited=new int[N][N];
inputMap(map);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(visited[i][j]==0) {
DFS(i,j,map,visited);
count++;
}
}
}
System.out.print(count+" ");
count=0;
for(int i=0;i<N;i++) Arrays.fill(visited[i],0);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(visited[i][j]==0) {
DFS_RG(i,j,map,visited);
count++;
}
}
}
System.out.print(count);
}
}
후기
그리 어렵지 않은 단순한 탐색문제라서 쉽게 풀 수 있었던 것 같습니다.