티끌모아 태산

백준 10026번: 적록색약 본문

코딩/코딩테스트

백준 10026번: 적록색약

yesman9 2024. 7. 30. 17:48

그래프가 주어졌고 탐색을 해야하므로 dfs나 bfs를 사용해야하는 문제이다.
최단경로 또는 특정한 목표지점이 있는 것이 아니고, 모든 그래프를 탐색해야하기 때문에 어떤 방식을 사용해도 상관 없다.
나는 편의상 익숙한 dfs를 사용했다.

적록색약인지 아닌지 구분하는 플래그 isColorWeakness 변수를 선언했고,
이 플래그가 true일 때 그래프 전체 탐색, false일 때 그래프 전체 탐색하여 총 두번의 전체 탐색을 했다.

기본적으로 다음 탐색 지점이 같은 컬러일 때 탐색하도록 했지만
적록색약일 때는 현재 컬러가 R 또는 G인지 검사하고, 다음 컬러도 R 또는 G인지 검사해서 같으면 탐색하도록 했다.

시간초과가 뜰 줄 알았는데 시간안에 클리어 됐다.

이게 왜 되지....?

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	static int n;
	static char grid[][];
	static boolean isVisited[][];
	static char curRGB;
	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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		n = Integer.parseInt(br.readLine());
		grid = new char[n][n];
		isVisited = new boolean[n][n];

		// 그리드 입력
		for (int i = 0; i < n; i++) {
			String str = br.readLine();
			for (int j = 0; j < n; j++) {
				grid[i][j] = str.charAt(j);
				isVisited[i][j] = false;
			}
		}

		// 적록색약 아닌사람 탐색
		int cnt = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (!isVisited[i][j]) {
					dfs(i, j, false);
					cnt++;
				}
			}
		}
		bw.write(cnt + " ");

		// 방문 배열 초기화
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				isVisited[i][j] = false;
			}
		}

		// 적록색약 탐색
		cnt = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (!isVisited[i][j]) {
					dfs(i, j, true);
					cnt++;
				}
			}
		}

		bw.write(String.valueOf(cnt));
		bw.flush();
		bw.close();
		br.close();
	}

	private static void dfs(int x, int y, boolean isColorWeakness) {
		isVisited[x][y] = true;
		curRGB = grid[x][y];
		for (int d = 0; d < 4; d++) {
			int nx = x + dx[d];
			int ny = y + dy[d];
			if (nx >= 0 && ny >= 0 && nx < n && ny < n && !isVisited[nx][ny]) { // 좌표 범위, 방문 check
				if (isColorWeakness) { // 색약인 경우
					if (curRGB == 'R' || curRGB == 'G') { // 현재 색깔이 (적 or 녹)인 경우
						if (grid[nx][ny] == 'R' || grid[nx][ny] == 'G') { // 다음 색이 (적 or 녹)이면 탐색
							dfs(nx, ny, true);
						}
					} else { // 현재 색깔이 파랑인 경우
						if (grid[nx][ny] == curRGB) { // 다음 색이 같은 색인지 확인
							dfs(nx, ny, false);
						}
					}
				} else { // 적록색약 아닌 경우
					if (grid[nx][ny] == curRGB) { // 다음 색이 같은 색인지 확인
						dfs(nx, ny, false);
					}
				}

			}
		}
	}

}

'코딩 > 코딩테스트' 카테고리의 다른 글

백준 7576번: 토마토  (0) 2024.08.05
백준 16928번: 뱀과 사다리 게임  (0) 2024.07.30
백준 7569번: 토마토  (0) 2024.07.23
백준 5430번: AC  (0) 2024.07.23
백준 11286번: 절댓값 힙  (0) 2024.07.02