ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 10026 : 적록 색약
    Solve Algorithms/BFS, DFS 2020. 4. 23. 17:05
    728x90

    출처 : https://www.acmicpc.net/problem/10026


    적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.

    크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)

    예를 들어, 그림이 아래와 같은 경우에

    적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)

    그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)

    둘째 줄부터 N개 줄에는 그림이 주어진다.

    출력

    적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.


    접근

    • BFS를 두 번 적용하면 되는 문제이다. 
    • 처음 적용한 후, visit 배열을 초기화해주고, 'G'을 'R'로 변경해준다. 

    코드

     
    package beak;
     
    import java.util.*;
    import java.io.*;
     
    class Loc {
        int x, y;
     
        public Loc(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
     
    public class Main {
     
        static int N;
        static char[][] map;
        static boolean[][] visit;
        static int[] dx = { -1010 };
        static int[] dy = { 0-101 };
        static Queue<Loc> q = new LinkedList<Loc>();
     
        public static void BFS(Loc d) {
            char color = map[d.x][d.y];
            visit[d.x][d.y] = true;
            q.add(d);
     
            while (!q.isEmpty()) {
                Loc t = q.remove();
     
                int X = t.x;
                int Y = t.y;
     
                for (int i = 0; i < 4; i++) {
                    int nextX = X + dx[i];
                    int nextY = Y + dy[i];
                    if (nextX >= 0 && nextY >= 0 && nextX < N && nextY < N) {
                        if (map[nextX][nextY] == color && !visit[nextX][nextY]) {
                            q.add(new Loc(nextX, nextY));
                            visit[nextX][nextY] = true;
                        }
                    }
                }
            }
        }
     
        public static void main(String[] args) throws Exception {
     
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
     
            N = Integer.parseInt(br.readLine());
     
            map = new char[N][N];
            visit = new boolean[N][N];
     
            int result1 = 0, result2 = 0;
     
            for (int i = 0; i < N; i++) {
                char[] c = br.readLine().toCharArray();
                for (int j = 0; j < N; j++) {
                    map[i][j] = c[j];
                }
            }
     
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if (!visit[i][j]) {
                        BFS(new Loc(i, j));
                        result1++;
                    }
                }
            }
     
            visit = new boolean[N][N];
     
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if (map[i][j] == 'G') {
                        map[i][j] = 'R';
                    }
                }
            }
     
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    if (!visit[i][j]) {
                        BFS(new Loc(i, j));
                        result2++;
                    }
                }
            }
     
            bw.write(result1 + " " + result2 + "\n");
     
            bw.flush();
            br.close();
     
        }
     
    }
    728x90

    'Solve Algorithms > BFS, DFS' 카테고리의 다른 글

    3187 : 양치기꿍  (0) 2020.04.24
    4179 : 불!  (0) 2020.04.24
    2583 : 영역 구하기  (0) 2020.04.22
    11403 : 경로 찾기  (0) 2020.04.22
    1012 : 유기농 배추  (0) 2020.04.19

    댓글

kxmjhwn@gmail.com