https://www.acmicpc.net/problem/10026
1. 아이디어
적록색약인 사람은 R과 G를 동일하게 생각하고 적록색약이 아닌 사람은 다르게 생각하는 상황에서 구역의 개수를 구하는 문제로 BFS 알고리즘과 DFS 알고리즘을 활용하면 간단하게 해결할 수 있다.
2. 문제풀이
적록색약이 아닌 경우를 먼저 구하고 이후 원본에서 초록색을 전부 빨간색으로 바꿔서 다시 구하는 방식으로 구현했다.
3. 코드
import java.io.*;
import java.util.*;
public class Main_BFS {
private static final int[] dr = {-1, 0, 1, 0};
private static final int[] dc = {0, 1, 0, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
char[][] map = new char[N][N];
for (int i = 0; i < N; i++) {
map[i] = br.readLine().toCharArray();
}
boolean[][] visited = new boolean[N][N];
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j]) continue;
bfs(i, j, N, map, visited, map[i][j]);
cnt++;
}
}
sb.append(cnt).append(" ");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 'G') map[i][j] = 'R';
}
}
visited = new boolean[N][N];
cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j]) continue;
bfs(i, j, N, map, visited, map[i][j]);
cnt++;
}
}
sb.append(cnt);
bw.write(sb.toString());
bw.flush();
}
private static void bfs(int r, int c, int N, char[][] map, boolean[][] visited, char color) {
Queue<int[]> q = new ArrayDeque<>();
q.add(new int[]{r, c});
visited[r][c] = true;
while (!q.isEmpty()) {
int[] node = q.remove();
for (int dir = 0; dir < 4; dir++) {
int nr = node[0] + dr[dir];
int nc = node[1] + dc[dir];
if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
if (map[nr][nc] != color || visited[nr][nc]) continue;
q.add(new int[]{nr, nc});
visited[nr][nc] = true;
}
}
}
}
import java.io.*;
public class Main_DFS {
private static final int[] dr = {-1, 0, 1, 0};
private static final int[] dc = {0, 1, 0, -1};
private static int N;
private static char[][] map;
private static boolean[][] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
map = new char[N][N];
for (int i = 0; i < N; i++) {
map[i] = br.readLine().toCharArray();
}
visited = new boolean[N][N];
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j]) continue;
dfs(i, j, map[i][j]);
cnt++;
}
}
sb.append(cnt).append(" ");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 'G') map[i][j] = 'R';
}
}
visited = new boolean[N][N];
cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j]) continue;
dfs(i, j, map[i][j]);
cnt++;
}
}
sb.append(cnt);
bw.write(sb.toString());
bw.flush();
}
private static void dfs(int r, int c, char color) {
visited[r][c] = true;
for (int dir = 0; dir < 4; dir++) {
int nr = r + dr[dir];
int nc = c + dc[dir];
if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
if (map[nr][nc] != color || visited[nr][nc]) continue;
dfs(nr, nc, color);
}
}
}
4. 후기
- BFS
- DFS
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 2580번 - 스도쿠 [Java] (0) | 2025.01.23 |
---|---|
[백준] 1389번 - 케빈 베이컨의 6단계 법칙 [Java] (0) | 2025.01.23 |
[백준] 6593번 - 상범 빌딩 [Java] (0) | 2025.01.23 |
[백준] 15595번 - 정답 비율 계산하기 [Java] (0) | 2025.01.22 |
[백준] 16200번 - 해커톤 [Java] (0) | 2025.01.22 |