[코테 풀이] 적록색약

시내·2023년 12월 16일
0

그 .. 나만 알아볼 수 있는 풀이.. 그런 거 ..?

Q_10026) 적록색약

출처 : 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로 초기화하는 과정을 거쳤다.

너무 비효율적이다 케케 ..

profile
contact 📨 ksw08215@gmail.com

0개의 댓글