백준 10026번: 적록색약 :: 매운코딩
728x90
300x250

3차원 배열의 이유는 [0][i][j]에는 적록색약이 아닌 경우, [1][i][j]에는 적록색약일 때의 경우를 넣기 위함이다.

for문 똑같은것을 변수만 바꿔서 하고 싶지 않아서......

import java.util.*;

class Position {
	int row;
	int col;
	int isRgb;
	
	public Position (int r, int c ,int b) {
		this.row = r;
		this.col = c;
		this.isRgb = b;
	}
}
public class Main {

	public static int N, noRGB=0, yesRGB=0;
	public static char[][][] map;
	public static boolean[][][] visit;
	public static Queue<Position> q;
	public static int[] dx = {0,1,0,-1}; //동남서북 
	public static int[] dy = {1,0,-1,0};
	public static void main(String[] args)  {		
		
		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
		map = new char[2][N][N];
		visit = new boolean[2][N][N];
		q = new LinkedList<Position>();
		
		for (int i = 0; i < N; i++) {
			String str = sc.next();
			for (int j = 0; j < N; j++) {
				map[0][i][j] = str.charAt(j);
				map[1][i][j] = str.charAt(j);
				if(map[1][i][j] == 'G')
					map[1][i][j] = 'R';
					
			}
		}
		
		for (int k = 0; k < 2; k++) {
			visit = new boolean[2][N][N];
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					// 무슨 색깔인지 받기
					char color = map[k][i][j];
					
					//0.방문하지 않은 곳이면서
					if(!visit[k][i][j]) {
				
						//1. 적록색약이 아닐 경우
						if(k==0)
							yesRGB++;
						else if(k==1)
							noRGB++;
						
						q.add(new Position(i, j, k));
						bfs(color);	
					}
				}
			}			
		}
		
		
		System.out.println(yesRGB+" "+noRGB);
		
		
	}
	// 지정된 색깔의 한 영역 다 돌기 (ex. R이면 red구역 다 visit true 처리)
	public static void bfs(char color) {
		
		
		while(!q.isEmpty()) {
			
			Position pos = q.poll();
			visit[pos.isRgb][pos.row][pos.col] = true;
			
			//1.방향 탐색
			for (int i = 0; i < dx.length; i++) {
				
				int nx = pos.row + dx[i];
				int ny = pos.col + dy[i];
				
				
				//2.종료조건
				//2-1.배열 범위 벗어나는가?
				if(nx >= N || ny >= N || nx < 0 || ny < 0)
					continue;
				
				//2-2.다른 문자가 나왔는가?
				if(map[pos.isRgb][nx][ny]!=color)
					continue;
				
				//2-3.방문 했던 곳인가?
				if(visit[pos.isRgb][nx][ny])
					continue;
				
				
				visit[pos.isRgb][nx][ny] = true;
				
				q.add(new Position(nx, ny, pos.isRgb));

			}
			
		}

	}


}
728x90

'알고리즘 > DFS & BFS' 카테고리의 다른 글

백준 3190번: 뱀  (0) 2020.03.08
백준 2667번: 단지번호붙이기  (1) 2020.03.02
백준 2468번: 안전 영역  (0) 2020.03.02
백준 7569번: 토마토  (0) 2020.03.02
백준 2178번: 미로 탐색  (0) 2020.03.01

+ Recent posts