본문 바로가기

알고리즘 문제풀이/백준

[백준][JAVA] 10026 - 적록색약

문제 출처 : https://www.acmicpc.net/problem/10026

 

 

 

문제

 

 

 

 

 

 

 

설명

R, G, B 군집들이 몇 개가 있는지 알아내기 위해 dfs를 구현했습니다.

그 다음에 기존 pic에서 R인 부분을 모두 G로 바꿔줌으로써 적록색약 환자 버전을 새로 만들었습니다. 그 후, 동일한 과정을 통해 G와 B의 군집들이 총 몇개 있는지 세어주는 방법을 통해 문제를 해결했습니다.

 

 

 

 

 

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BOJ10026_RGB {
	
	static char[][] pic;
	static boolean[][] visited;
	static int N, R, G, B;
	static int[] dx = {-1, 1, 0, 0};
	static int[] dy = {0, 0, -1, 1};
 	
	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		
		pic = new char[N][N]; //일반 그림
		visited = new boolean[N][N];
		for(int i=0; i<N; i++) {
			String s = br.readLine();
			pic[i]=s.toCharArray();
		} //입력 완료
		
		int cnt=0;
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(!visited[i][j]) {
					cnt++;
					dfs(i, j, pic[i][j]);
				}
			}
		}
		System.out.print(cnt + " ");
		
		//적록색약 환자 버전
		makePatientPic();
		//초기화
		visited = new boolean[N][N];
		cnt=0;
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(!visited[i][j]) {
					cnt++;
					dfs(i, j, pic[i][j]);
				}
			}
		}
		System.out.print(cnt);
	}

	private static void makePatientPic() {
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(pic[i][j] == 'R')
					pic[i][j]='G';
			}
		}
		
	}

	private static void dfs(int x, int y, char color) {
		
		visited[x][y]=true;
		
		for(int i=0; i<4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if(nx>=0 && nx<N && ny>=0 && ny<N && pic[nx][ny]==color && !visited[nx][ny]) { 
				//범위 안에 있고 색이 같으며(같은 구역이라면) 아직 방문하지 않았다면
				dfs(nx, ny, color);
			}
		}
	}
}