본문 바로가기
algorithm

[JAVA] 백준 - 적록색약 10026 ( BFS )

by onejunu 2020. 10. 16.

www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

단순히 그룹으로 묶어주고 그룹이 몇개 나오는지 BFS 를 이용하여 해결한다.

 

관건은 적록색약이 있는 경우 초록색과 빨간색을 어떻게 처리 할지다.

 

본인은 아래 코드 처럼 처리하였다.

if((curColor=='R' || curColor=='G') && (otherColor=='R' || otherColor=='G'))
    return true;
else return curColor == otherColor;

 

현재 컬러와 비교하려는 컬러를 각각 curColor 와 otherColor 로 하였다.

 

위처럼 처리하면 현재가 초록색 또는 빨간색이면서 비교하려는 컬러가 초록색또는 빨간색이면 참을 반환한다.

 

 

# 전체 코드

import java.util.LinkedList;
import java.util.*;


class Main{
    static int n;
    static char[][] arr;
    static boolean[][] v1;
    static int ans1;
    static int ans2;

    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        arr = new char[n][n];
        v1 = new boolean[n][n];

        for(int i=0;i<n;i++){
            char[] temp = sc.next().toCharArray();
            arr[i]= temp;
        }

        // t=0 일반인 && t=1 적록색약
        for(int t=0;t<2;t++) {
            v1 = new boolean[n][n];

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (!v1[i][j]) {
                        if(t==0) ans1++;
                        else ans2++;
                        v1[i][j] = true;
                        Queue<Pair> q = new LinkedList<>();
                        q.add(new Pair(i, j));
                        char color = arr[i][j];
                        while (!q.isEmpty()) {
                            Pair p = q.poll();

                            for (int k = 0; k < 4; k++) {
                                int nx = p.x + dx[k];
                                int ny = p.y + dy[k];

                                if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue;

                                if (checkColor(t,color,arr[nx][ny]) && !v1[nx][ny]) {
                                    v1[nx][ny] = true;
                                    q.add(new Pair(nx, ny));
                                }
                            }
                        }
                    }
                }
            }
        }

        System.out.println(ans1+" "+ans2);

    }

    static boolean checkColor(int t, char curColor,char otherColor){
        if(t==1 && (curColor=='R' || curColor=='G') && (otherColor=='R' || otherColor=='G'))
        {
            return true;
        }
        return curColor==otherColor;
    }

    static class Pair{
        int x,y;

        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}

댓글