백준 10026 - 적록색약
Updated:
Java
10026 번 - 적록색약
문제
접근 방법
단순하게 해결하였다.
먼저, 일반인의 경우 구역이 몇개로 나누어져 있는지 확인한 다음,
위 BFS 코드를 이용하여 적록색약일 경우, 색 ‘G’와 ‘R’를 ‘A’로 치환하여 다시 한번 계산한다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, result, result_b;
static char[][] board;
static boolean[][] vis;
static boolean[][] blind;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
n = stoi(br.readLine());
board = new char[n][n];
vis = new boolean[n][n];
blind = new boolean[n][n];
String input;
for(int i = 0; i < n; i++) {
input = br.readLine();
for(int j = 0; j < n; j++) {
board[i][j] = input.charAt(j);
}
}
char color;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
// 일반인
if(!vis[i][j])
BFS(i,j, board[i][j]);
// 적록색약
if(!blind[i][j]) {
color = board[i][j] != 'B' ? 'A' : 'B'; // G나 R를 A로 치환
BFS_b(i,j, color);
}
}
}
System.out.println(result + " " + result_b);
br.close();
}
static int[] dy = {-1,1,0,0};
static int[] dx = {0,0,-1,1};
// 일반인이 그리드를 확인 할 때
private static void BFS(int y, int x, char color) {
result++;
Queue<int[]> queue = new LinkedList<int[]>();
queue.add(new int[] {y,x});
vis[y][x] = true;
int ny, nx;
int[] q;
while(!queue.isEmpty()) {
q = queue.poll();
y = q[0];
x = q[1];
for(int i = 0; i < 4; i++) {
ny = y + dy[i];
nx = x + dx[i];
if(isIn(ny,nx) && !vis[ny][nx] && color == board[ny][nx]) {
vis[ny][nx] = true;
queue.add(new int[] {ny,nx});
}
}
}
}
// 적록색약이 그리드를 확인 할 때
private static void BFS_b(int y, int x, char color) {
result_b++;
Queue<int[]> queue = new LinkedList<int[]>();
queue.add(new int[] {y,x});
blind[y][x] = true;
int ny, nx;
int[] q;
char sameC;
while(!queue.isEmpty()) {
q = queue.poll();
y = q[0];
x = q[1];
for(int i = 0; i < 4; i++) {
ny = y + dy[i];
nx = x + dx[i];
if(isIn(ny,nx) && !blind[ny][nx]) {
sameC = board[ny][nx] != 'B' ? 'A' : 'B'; // G나 R를 A로 치환
if(color == sameC) {
blind[ny][nx] = true;
queue.add(new int[] {ny,nx});
}
}
}
}
}
// 주어진 범위 안에 있는가
public static boolean isIn(int y, int x){
if(y < 0 || y >= n || x < 0 || x >= n)
return false;
return true;
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}