๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 10026๋ฒˆ ์ ๋ก์ƒ‰์•ฝ ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 8. 4.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 10026๋ฒˆ ์ ๋ก์ƒ‰์•ฝ ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

10026๋ฒˆ: ์ ๋ก์ƒ‰์•ฝ

์ ๋ก์ƒ‰์•ฝ์€ ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋Š๋ผ์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ์€ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ๊ณผ๋Š” ์ข€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฐ ์นธ์— R(๋นจ๊ฐ•), G(์ดˆ๋ก)

www.acmicpc.net

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

 

๋ฌธ์ œ ์ ‘๊ทผ

 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” BFS ๋‚˜ DFS ๊ฐ™์€ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์— ๊ตฌํ˜„๋ ฅ์ด ์กฐ๊ธˆ ์š”๊ตฌ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

์‚ฌ์‹ค BFS๋‚˜ DFS ๋ฅผ ์ž˜ ๋‹ค๋ฃฐ ์ค„ ์•ˆ๋‹ค๋ฉด, ํ˜น์€ Silver 1 ๋ฌธ์ œ๊นŒ์ง€ ๋ง‰ํž˜์—†์ด ํ’€ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€๋ฒผ์šด ๋ฌธ์ œ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

ํ•ด๊ฒฐ๋ฒ•

 

์ ๋ก ์ƒ‰์•ฝ์ด ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ‰์€ ๋นจ๊ฐ•๊ณผ ์ดˆ๋ก์ด๋‹ˆ ์ ๋ก์ƒ‰์•ฝ์˜ ์‹œ์•ผ์—์„œ ๋นจ๊ฐ•๊ณผ ์ดˆ๋ก์„ ํ•˜๋‚˜์˜ ์ƒ‰์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์ •์ƒ์ธ์€ 3๊ฐ€์ง€ ์ƒ‰์„ ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ๋ถ„ํ•ด์„œ ์—ฐ๊ฒฐ ์š”์†Œ ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

 

์ •๋‹ต ์ฝ”๋“œ

public class Main {

    private static int[] xPos = {1, -1, 0, 0};
    private static int[] yPos = {0, 0, 1, -1};
    private static int n;

    private static boolean[][] visited;
    private static String[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        n = Integer.parseInt(br.readLine());

        arr = new String[n][n];


        for (int i = 0; i < n; i++) {
            String[] s = br.readLine().split("");
            for (int j = 0; j < n; j++) {
                arr[i][j] = s[j];
            }
        }

        int normal = 0;
        int colorBlindness = 0;

        visited = new boolean[n][n];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(!visited[i][j]) { // ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค๋ฉด?
                    if(arr[i][j].equals("R")) {
                        visitSingleColor(j, i, "R");
                        normal++;
                    }else if(arr[i][j].equals("G")) {
                        visitSingleColor(j, i, "G");
                        normal++;
                    }else if(arr[i][j].equals("B")) {
                        visitSingleColor(j, i, "B");
                        normal++;
                    }
                }
            }
        }

        visited = new boolean[n][n];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(!visited[i][j]) { // ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค๋ฉด?
                    if(arr[i][j].equals("R") || arr[i][j].equals("G")) {
                        visitMultiColor(j, i);
                        colorBlindness++;
                    }else if(arr[i][j].equals("B")) {
                        visitSingleColor(j, i, "B");
                        colorBlindness++;
                    }
                }
            }
        }

        bw.write(normal + " " + colorBlindness);

        bw.flush();
        bw.close();
    }

    private static void visitSingleColor(int x, int y, String color) {
        Queue<Position> queue = new LinkedList<>();
        queue.add(new Position(x, y));
        visited[y][x] = true;

        while(!queue.isEmpty()) {
            Position front = queue.remove();

            for (int i = 0; i < 4; i++) {
                int xx = front.x + xPos[i];
                int yy = front.y + yPos[i];

                if(Position.isValid(xx, yy)) {
                    if(!visited[yy][xx] && arr[yy][xx].equals(color)) {
                        visited[yy][xx] = true;
                        queue.add(new Position(xx, yy));
                    }
                }
            }
        }
    }

    private static void visitMultiColor(int x, int y) {
        Queue<Position> queue = new LinkedList<>();
        queue.add(new Position(x, y));
        visited[y][x] = true;

        while(!queue.isEmpty()) {
            Position front = queue.remove();

            for (int i = 0; i < 4; i++) {
                int xx = front.x + xPos[i];
                int yy = front.y + yPos[i];

                if(Position.isValid(xx, yy)) {
                    if(!visited[yy][xx] && (arr[yy][xx].equals("R") || arr[yy][xx].equals("G"))) {
                        visited[yy][xx] = true;
                        queue.add(new Position(xx, yy));
                    }
                }
            }
        }
    }

    private static class Position {
        int x;
        int y;
        public Position(int x, int y) {
            this.x = x;
            this.y = y;
        }

        static boolean isValid(int x, int y) {
            return 0 <= x && x < n && 0 <= y && y < n;
        }
    }
}

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€