본문 바로가기

ALGORITHM

백준 10026 적록색약 (Java)

1. 문제 링크

 

10026번: 적록색약

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

dfs로 풀었다. 

적록색약인 사람과 적록색약이 아닌 사람으로 나눠서 각각 dfs를 진행했다.

적록색약인 사람은 색이 R이나 G인 경우를 함께 계산하고 적록색약이 아닌사람은 각각 따로 계산하면 된다.

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	private static StringBuilder sb = new StringBuilder();
	static boolean[][] visit;
	static char[][] map;
	static int N, r, g, b;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		N = Integer.parseInt(br.readLine());
		map = new char[N][N];
		int[][] where = new int[3][2]; // r,g,b의 x,y 좌표
		
		for(int i=0;i<N;i++) {
			String str = br.readLine();
			for(int j=0;j<N;j++) {
				map[i][j] = str.charAt(j);
			}
		} //입력 끝
		
		visit = new boolean[N][N];
		
		int cnt1 = 0, cnt2 = 0;
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				if(!visit[i][j]){ //방문하지 않았으면 들어가기
					dfs1(i, j);
					cnt1 ++;
				}
			}
		}
		
		visit = new boolean[N][N];
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				if(!visit[i][j]){ //방문하지 않았으면 들어가기
					dfs2(i, j);
					cnt2 ++;
				}
			}
		}
		
		System.out.println(cnt1 + " "+ cnt2);
	}

	static int dx[] = {-1, 0, 1, 0};
	static int dy[] = {0, 1, 0, -1};
	private static void dfs1(int x, int y) {
		char color = map[x][y];
		visit[x][y] = true;
		
		for(int d=0; d<4;d++) {
			int X = x + dx[d];
			int Y = y + dy[d];
			
			if(X>=0 && X<N && Y>=0 && Y<N && map[X][Y]==color && !visit[X][Y]) {
				dfs1(X, Y);
			}
			
		}
	}
	
	private static void dfs2(int x, int y) {
		char color = map[x][y];
		
		visit[x][y] = true;
		
		for(int d=0; d<4;d++) {
			int X = x + dx[d];
			int Y = y + dy[d];
			
			if(X>=0 && X<N && Y>=0 && Y<N /*&& map[X][Y]==color*/ && !visit[X][Y]) {
				if(color == 'B') {
					if(map[X][Y] == 'B') {
						dfs2(X, Y);
					}
				}
				else {
					if(map[X][Y] != 'B') {
						dfs2(X,Y);
					}
				}
			}
			
		}
		
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 1018 체스판 다시 칠하기 (Java)  (0) 2023.03.21
백준 1495 기타리스트 (Java)  (0) 2023.03.21
백준 4153 직각 삼각형(Java)  (0) 2023.03.20
백준 17281 ⚾ 야구 (Java)  (0) 2023.03.19
백준 13023 ABCDE (Java)  (0) 2023.03.19