티스토리 뷰

Algorithm

백준_적록색약_10026

Young_J 2020. 11. 11. 23:52

//알고리즘

1. dfs문제

2. 2가지 방법으로 나눠서 각각 계산

 -> 1. 적록색약인 사람. 

 -> 2. 적록색약이 아닌 사람

 

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 적록색약 {
	static int N;
	static char[][] map;
	static boolean v[][];
	static int[] dr = { -1, 1, 0, 0 };
	static int[] dc = { 0, 0, -1, 1 };

	static class Point {
		int x;
		int y;
		char col;

		public Point(int x, int y, char col) {
			super();
			this.x = x;
			this.y = y;
			this.col = col;
		}

	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());

		map = new char[N][N];

		for (int i = 0; i < N; i++) {
			String str = br.readLine();
			for (int j = 0; j < N; j++) {
				map[i][j] = str.charAt(j);
			}
		}
		v = new boolean[N][N];
		int cntN = 0;
		for (int r = 0; r < N; r++) {
			for (int c = 0; c < N; c++) {
				if (!v[r][c]) {
					cntN++;
					dfs(new Point(r, c, map[r][c]), v);
				}
			}
		}
        
		// 적록색약인 사람
		v = new boolean[N][N];
		int cntY = 0;
		for (int r = 0; r < N; r++) {
			for (int c = 0; c < N; c++) {
				if (!v[r][c]) {
					cntY++;
					dfsY(new Point(r, c, map[r][c]), v);
				}
			}
		}

		System.out.println(cntN + " " + cntY);

	}

	// 적록색약 기존 dfs에 조건만 추가해줌
	private static void dfsY(Point point, boolean[][] v) {
		v[point.x][point.y] = true;

		for (int k = 0; k < 4; k++) {
			int nr = point.x + dr[k];
			int nc = point.y + dc[k];

			if (nr >= 0 && nc >= 0 && nr < N && nc < N) {
				if (point.col == 'R' || point.col == 'G') {
					if ((map[nr][nc] == 'R' || map[nr][nc] == 'G') && !v[nr][nc]) {
						dfsY(new Point(nr, nc, map[nr][nc]), v);
					}
				} else {
					if (map[nr][nc] == point.col && !v[nr][nc]) {
						dfsY(new Point(nr, nc, map[nr][nc]), v);
					}
				}

			}
		}

	}

	private static void dfs(Point point, boolean[][] v) {
		v[point.x][point.y] = true;

		for (int k = 0; k < 4; k++) {
			int nr = point.x + dr[k];
			int nc = point.y + dc[k];

			if (nr >= 0 && nc >= 0 && nr < N && nc < N) {
				if (map[nr][nc] == point.col && !v[nr][nc]) {
					dfs(new Point(nr, nc, map[nr][nc]), v);
				}
			}

		}

	}

	private static void print(boolean[][] v) {
		for (int i = 0; i < v.length; i++) {
			for (int j = 0; j < v.length; j++) {
				System.out.print(v[i][j] + " ");
			}
			System.out.println();
		}

	}

	// 출력부 확인용
	private static void print(char[][] v) {
		for (int i = 0; i < v.length; i++) {
			for (int j = 0; j < v.length; j++) {
				System.out.print(v[i][j] + " ");
			}
			System.out.println();
		}

	}

}

 

 

'Algorithm' 카테고리의 다른 글

백준_경잭적전염_18405  (0) 2020.11.13
백준_바이러스_2606  (0) 2020.11.12
백준_녹색옷입은애가 젤다지_4485  (0) 2020.11.10
백준_벽부수고 이동하기_2206  (0) 2020.11.09
백준_색종이 만들기_2630  (0) 2020.11.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함