티스토리 뷰
//알고리즘
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 |