https://www.acmicpc.net/problem/10026
[풀이]
- DFS 유형의 문제였습니다.
- DFS를 적록색약인 경우와 적록색약이 아닌 경우를 구분해서 메인 메소드에서 구현합니다.
- 처음에는, 아닌 경우이므로 일반적인 DFS 형식으로 구현하고
- 이후, visited 2차원 배열은 초기화 및 색깔에 대한 조건을 추가해서 영역의 개수를 세야 합니다.
[추가]
- Arrays.fill() 메소드를 사용하였는데 java.lang.ArrayStoreException 이러한 오류가 발생했습니다. 알고보니, Arrays.fill() 메소드는 1차원 배열에서만 사용할 수 있어서 이를 2차원 배열에 사용할 수 있게 변형해서 작성했습니다.
for (boolean[] i : visited) Arrays.fill(i, false);
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int[] dx = {0, -1, 0, 1};
static int[] dy = {1, 0, -1, 0};
static int N;
static char arr[][];
static boolean[][] visited;
public static void dfs(int x, int y) {
visited[x][y] = true;
char color = arr[x][y];
for (int i = 0; i < 4; i++) {
int nextX = x + dx[i];
int nextY = y + dy[i];
if (!visited[nextX][nextY] && arr[nextX][nextY] == color) {
if (nextX > 0 && nextY > 0 && nextX <= N && nextY <= N) {
dfs(nextX, nextY);
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new char[N + 2][N + 2];
visited = new boolean[N + 2][N + 2];
int allCount = 0;
int redGreenCount = 0;
for (int i = 1; i < N + 1; i++) {
String input = br.readLine();
for (int j = 1; j < N + 1; j++) {
arr[i][j] = input.charAt(j - 1);
}
}
for (int i = 1; i < N + 1; i++) {
for (int j = 1; j < N + 1; j++) {
if (!visited[i][j]) {
dfs(i, j);
allCount += 1;
}
}
}
for (boolean[] i : visited) Arrays.fill(i, false);
for (int i = 1; i < N + 1; i++) {
for (int j = 1; j < N + 1; j++) {
if (arr[i][j] == 'R')
arr[i][j] = 'G';
}
}
for (int i = 1; i < N + 1; i++) {
for (int j = 1; j < N + 1; j++) {
if (!visited[i][j]) {
dfs(i, j);
redGreenCount += 1;
}
}
}
System.out.println(allCount + " " + redGreenCount);
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 1002번 : 터렛 (Java) (0) | 2021.10.19 |
---|---|
백준 16198번 : 에너지 모으기 (Java) (0) | 2021.10.12 |
백준 2002번 : 추월 (Java) (0) | 2021.10.08 |
백준 1052번 : 물병 (Java) (0) | 2021.10.08 |
백준 16973번 : 직사각형 탈출 (Java) (0) | 2021.10.06 |