코테 공부

[DFS] 적록색약(백준 10026번, 자바)☆

DaEun_ 2023. 1. 28. 01:12

 

10026번: 적록색약 (acmicpc.net)

 

10026번: 적록색약

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

www.acmicpc.net

boolean[] v;

Arrays.fill(v, false) : 모든 배열을 false로 초기화 

import java.io.*;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;


class Main
{
	
	static int[] dx= {0,1,0,-1};
	static int[] dy= {1,0,-1,0};
	static boolean[][] visit;
	static int N;
	static char[][] arr;
	
	public static void main(String args[]) throws Exception
	{
		int answer=0;
		int answer2=0;
		
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		N=Integer.parseInt(br.readLine());
		
		arr=new char[N][N];
		visit=new boolean[N][N];
		
		for(int i=0;i<N;i++) {
			String a=br.readLine();
			for(int j=0;j<N;j++) {
				arr[i][j]=a.charAt(j);
			}
		}
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				if(!visit[i][j]) {
					answer++;
					dfs(i,j);
				}
			}
		}
		
		
		for(boolean[] v:visit) {
			Arrays.fill(v, false);
		}
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				if(arr[i][j]=='R') arr[i][j]='G';
			}
		}
		
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				if(!visit[i][j]) {
					dfs(i,j);
					answer2++;
				}
			}
		}
		System.out.println(answer+" " +answer2);
	}
	
	
	static void dfs(int x, int y) {
		visit[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 || visit[nx][ny]) continue;
			
			if(arr[x][y]==arr[nx][ny]) {
				visit[nx][ny]=true;
				dfs(nx,ny);
			}
			
		}
	}
	
		
		
}