그 .. 나만 알아볼 수 있는 풀이.. 그런 거 ..?
출처 : https://www.acmicpc.net/problem/10026
import java.util.*;
import java.io.*;
public class Q_10026 {
static boolean[][] visited;
static int[][] matrix;
static int[] dx = {0, 0, -1, 1};
static int[] dy = {-1, 1, 0, 0};
static int n;
static int cnt1;
static int cnt2;
static int cnt3;
static int cnt4;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
matrix = new int[n][n];
visited = new boolean[n][n];
cnt1 = 0;
for (int i = 0; i < n; i++) {
String line = br.readLine();
for (int j = 0; j < n; j++) {
if (line.charAt(j) == 'R') {
matrix[i][j] = 1;
} else if (line.charAt(j) == 'G') {
matrix[i][j] = 2;
} else if (line.charAt(j) == 'B') {
matrix[i][j] = -1;
}
}
}
for (int p = 0; p < n; p++) {
for (int q = 0; q < n; q++) {
if (!visited[p][q] && matrix[p][q] == -1) { //B
bfs1(p, q);
cnt1++;
}
}
}
reset();
for (int p = 0; p < n; p++) {
for (int q = 0; q < n; q++) {
if (!visited[p][q] && matrix[p][q] > 0) { //R+G
bfs2(p, q);
cnt2++;
}
}
}
reset();
for (int p = 0; p < n; p++) {
for (int q = 0; q < n; q++) {
if (!visited[p][q] && matrix[p][q] == 1) { //R
bfs3(p, q);
cnt3++;
}
}
}
reset();
for (int p = 0; p < n; p++) {
for (int q = 0; q < n; q++) {
if (!visited[p][q] && matrix[p][q] == 2) { //G
bfs4(p, q);
cnt4++;
}
}
}
System.out.print((cnt3 + cnt4 + cnt1) + " " + (cnt1 + cnt2));
}
private static void reset() {
for (int p = 0; p < n; p++) {
for (int q = 0; q < n; q++) {
visited[p][q] = false;
}
}
}
private static void bfs1(int a, int b) {
Deque<int[]> deque = new ArrayDeque<>();
visited[a][b] = true;
deque.add(new int[]{a, b});
while (!deque.isEmpty()) {
int[] d = deque.removeFirst();
for (int i = 0; i < 4; i++) {
int x = dx[i] + d[0];
int y = dy[i] + d[1];
if (x >= 0 && y >= 0 && x < n && y < n) {
if (!visited[x][y] && matrix[x][y] == -1) {
visited[x][y] = true;
deque.add(new int[]{x, y});
}
}
}
}
}
private static void bfs2(int a, int b) {
Deque<int[]> deque = new ArrayDeque<>();
visited[a][b] = true;
deque.add(new int[]{a, b});
while (!deque.isEmpty()) {
int[] d = deque.removeFirst();
for (int i = 0; i < 4; i++) {
int x = dx[i] + d[0];
int y = dy[i] + d[1];
if (x >= 0 && y >= 0 && x < n && y < n) {
if (!visited[x][y] && matrix[x][y] > 0) {
visited[x][y] = true;
deque.add(new int[]{x, y});
}
}
}
}
}
private static void bfs3(int a, int b) {
Deque<int[]> deque = new ArrayDeque<>();
visited[a][b] = true;
deque.add(new int[]{a, b});
while (!deque.isEmpty()) {
int[] d = deque.removeFirst();
for (int i = 0; i < 4; i++) {
int x = dx[i] + d[0];
int y = dy[i] + d[1];
if (x >= 0 && y >= 0 && x < n && y < n) {
if (!visited[x][y] && matrix[x][y] == 1) {
visited[x][y] = true;
deque.add(new int[]{x, y});
}
}
}
}
}
private static void bfs4(int a, int b) {
Deque<int[]> deque = new ArrayDeque<>();
visited[a][b] = true;
deque.add(new int[]{a, b});
while (!deque.isEmpty()) {
int[] d = deque.removeFirst();
for (int i = 0; i < 4; i++) {
int x = dx[i] + d[0];
int y = dy[i] + d[1];
if (x >= 0 && y >= 0 && x < n && y < n) {
if (!visited[x][y] && matrix[x][y] == 2) {
visited[x][y] = true;
deque.add(new int[]{x, y});
}
}
}
}
}
}
1) bfs를 사용해서 R그룹, G그룹, B그룹의 개수를 구했다.
2) 색맹인 사람은 R과 G를 구별하지 못하기에 각 숫자를 1과 2로 (양수라는 공통점)으로 할당하고 B는 -1로 할당해서 matrix를 만들었다.
3) 색맹인 사람인 경우: B의 개수, R+G의 개수
그리고 색맹이 아닌 사람인 경우: B의 개수, R의 개수, G의 개수를 따로 구해줘야한다.
4) 그렇기에 각 색깔 무리의 개수를 구할 때마다 visited 배열을 전체 false로 초기화하는 과정을 거쳤다.
너무 비효율적이다 케케 ..