단순히 그룹으로 묶어주고 그룹이 몇개 나오는지 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;
}
}
}
'algorithm' 카테고리의 다른 글
[JAVA] 백준 - 동전0 - 11047 (그리디) (0) | 2020.10.16 |
---|---|
[JAVA] 백준 - 4연산 14395( BFS) (2) | 2020.10.16 |
[JAVA] 백준 - 소수 경로 1963 ( BFS + 에라토스테네스의 체) (0) | 2020.10.16 |
[JAVA] 백준 - 레이저 통신 6087 (BFS) (테스트케이스 제공) (0) | 2020.10.15 |
[JAVA] 백준 - 아기상어 16236 (BFS) (0) | 2020.10.15 |
댓글