백준 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);
    }
}

총평

후기

개선할 점