[JAVA]백준10026번 적록색약

1 minute read

문제는 다음과 같다.

오늘은 백준10026번 적록색약 문제를 풀어보도록 하자. JAVA에 익숙해지기 위해서 푼 기본적인 BFS or DFS문제이다.

적록색약이 아닌 사람과 적록색약인 사람이 보는 그룹의 갯수를 구하는 문제였다. BFS로 풀 수도 있고 DFS로 풀 수도 있는 문제였다. 본인은 DFS로 풀이를 하겠다.

1) 적록색약이 아닌 사람 –> 적록색약이 아닌 사람은 R,G,B를 모두 구별할 수 있다. 따라서 main함수에서 방문처리가 되지 않았으면 DFS함수를 실행을 하고 DFS함수에서 방문처리를 할 수 있게 로직을 짰다.

2) 적록색약인 사람 –> 적록색약인 사람은 R,G를 구별못하고 B를 구별할 수 있다. 따라서 적록색약이 아닌 사람의 함수와 같이 방문처리를 하되, 현재 위치가 R or G이고 다음 위치가 R or G이면 재귀함수를 호출하는 형식으로 로직을 짰다. 그리고 현재 위치가 B라면 다음 위치도 B여야 한다.

                                     [코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static int N,Can_answer=0,Cant_answer=0;
    static boolean visit[][];
    static char map[][];
    static int dir[][] = { {-1,0},{0,1},{1,0},{0,-1} };

    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        map = new char[N][N];
        visit = new boolean[N][N];

        for(int i=0;i<N;i++){
            String s = br.readLine();
            map[i] = s.toCharArray();
        }
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(!visit[i][j]){
                    Can_coLor(i,j);
                    Can_answer++;
                }
            }
        }
        System.out.printf(Can_answer + " ");
        for(int i=0;i<N;i++) {
            for (int j = 0; j < N; j++) {
                visit[i][j] = false;
            }
        }

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(!visit[i][j]){
                    Cant_coLor(i,j);
                    Cant_answer++;
                }
            }
        }
        System.out.println(Cant_answer);
    }
    public static void Can_coLor(int y, int x){
        visit[y][x] = true;
        for(int i=0;i<4;i++){
            int my = y+dir[i][0];
            int mx = x+dir[i][1];

            if(my>=0&&mx>=0&&my<N&&mx<N){
                if(!visit[my][mx]){
                    if(map[y][x] == map[my][mx]){
                        visit[my][mx] = true;
                        Can_coLor(my,mx);
                    }
                }
            }
        }
    }
    public static void Cant_coLor(int y, int x){
        visit[y][x] = true;
        for(int i=0;i<4;i++){
            int my = y+dir[i][0];
            int mx = x+dir[i][1];

            if(my>=0&&mx>=0&&my<N&&mx<N){
                if(!visit[my][mx]){
                    if(map[y][x] == 'R' || map[y][x] == 'G'){
                        if(map[my][mx] == 'R' || map[my][mx] =='G'){
                            visit[my][mx] = true;
                            Cant_coLor(my,mx);
                        }
                    }
                    else{
                        if(map[y][x] == map[my][mx]){
                            visit[my][mx] = true;
                            Cant_coLor(my,mx);
                        }
                    }
                }
            }
        }
    }
}