하루에 한 문제

[BOJ-10026][그래프이론] 적록색약 -Java 본문

알고리즘/백준

[BOJ-10026][그래프이론] 적록색약 -Java

dkwjdi 2021. 4. 5. 21:03

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

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

www.acmicpc.net

package algo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class boj_10226_적록색약 {
	static char map[][];
	static int N;
	static boolean visited[][][];
	static int dx[]= {0,0,-1,1};
	static int dy[]= {-1,1,0,0};
	public static void main(String[] args) throws IOException {
		BufferedReader br=  new BufferedReader(new InputStreamReader(System.in));
		
		N=Integer.parseInt(br.readLine());
		map=new char[N][N];
		visited= new boolean[N][N][2];
		for(int i=0; i<N; i++) {
			String input=br.readLine();
			for(int j=0; j<input.length(); j++) {
				map[i][j]=input.charAt(j);
			}
		}
		
		int blind=0;
		int notBlind=0;
		String blindColor="RG";
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				//적록색약 아닌사람
				if(!visited[i][j][0]) {
					bfs(i,j,String.valueOf(map[i][j]), 0);
					notBlind++;
				}
				//적록색약인 사람
				if(!visited[i][j][1]) { 
					if(map[i][j]=='R' || map[i][j]=='G') bfs(i,j, blindColor, 1); //R, G 
					else bfs(i,j,String.valueOf(map[i][j]),1); //B
					blind++;
				}
			}
		}
		
		System.out.println(notBlind);
		System.out.println(blind);
	
	}
	private static void bfs(int i, int j, String blindColor, int k) {
		Queue <int []> queue = new LinkedList<>();
		visited[i][j][k]=true;
		queue.offer(new int[] {i,j});
		
		while(!queue.isEmpty()) {
			int []point = queue.poll();
			
			for(int d=0; d<4; d++) {
				int nx=point[0]+dx[d];
				int ny=point[1]+dy[d];
				
				if(nx<0 || ny<0 || nx>=N || ny>=N || visited[nx][ny][k] ) continue;
				if(!blindColor.contains(String.valueOf(map[nx][ny]))) continue;
				
				queue.offer(new int[] {nx,ny});
				visited[nx][ny][k]=true;
			}
		}
	}
}

소요시간 : 22분

 

전형적인 BFS문제입니다.

3차원 visited를 선언해 방문체크를 하였습니다.

 

적록색약을 처리하기 위해서 아래처럼 선언해 사용하였습니다.

적록색약을 처리할 때 현재 map[i][j]값이 R,이나 G라면 blindColor를 매개변수로 넘겨주어 contains로 확인을 하였ㅅㅂ늬다.

 

너무 쉬운 문제라서 딱히 설명할게 없네용

 

끝~

Comments