백준 - 적록색약
문제 링크
https://www.acmicpc.net/problem/10026
문제 입출력
5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR
4 3
문제 풀이
package problem.BJ;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class BJ10026_적록색약 {
static int ans, ansB, N;
static char[][] map;
static boolean[][] visit;
// 상하좌우
static int[] dy = { -1, 1, 0, 0 };
static int[] dx = { 0, 0, -1, 1 };
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("input.txt"));
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++) map[i] = br.readLine().toCharArray();
// 탐색
// 적록색약이 아닌 사람
visit = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!visit[i][j]) {
dfs(i, j);
ans++;
}
}
}
// 적록색약인 사람
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) if (map[i][j] == 'G') map[i][j] = 'R';
visit = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) if (!visit[i][j]) {
dfs(i, j);
ansB++;
}
}
System.out.println(ans + " " + ansB);
} // end main
private static void dfs(int y, int x) {
for (int d = 0; d < 4; d++) {
int ny = y + dy[d];
int nx = x + dx[d];
if (ny < 0 || ny >= N || nx < 0 || nx >= N) continue;
if (visit[ny][nx]) continue;
if (map[ny][nx] != map[y][x]) continue;
visit[ny][nx] = true;
dfs(ny, nx);
}
} // end dfs
}
- 적록색약인 사람은 R과 G 을 혼동한다.
- 따라서 적록색약인 사람의 시야를 카운팅 하기 전에 G에 속하는 것들을 R로 바꿔준다.
- 그런 다음 dfs 를 돌린다.
# 백준 적록색약 java
728x90
'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > 백준 알고리즘' 카테고리의 다른 글
[BJ16236] 아기 상어 (0) | 2022.10.11 |
---|---|
[BJ3055] 탈출 (1) | 2022.10.10 |
[BJ13023] ABCDE (0) | 2022.10.02 |
[BJ9019] DSLR (0) | 2022.09.27 |
[BJ2583] 영역 구하기 (0) | 2022.09.21 |