πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.10026 적둝색약 문제 풀이

πŸ“– 문제

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

적둝색약은 빨간색과 μ΄ˆλ‘μƒ‰μ˜ 차이λ₯Ό 거의 λŠλΌμ§€ λͺ»ν•œλ‹€. λ”°λΌμ„œ, 적둝색약인 μ‚¬λžŒμ΄ λ³΄λŠ” 그림은 μ•„λ‹Œ μ‚¬λžŒμ΄ λ³΄λŠ” κ·Έλ¦Όκ³ΌλŠ” μ’€ λ‹€λ₯Ό 수 μžˆλ‹€.

크기가 NΓ—N인 κ·Έλ¦¬λ“œμ˜ 각 칸에 R(λΉ¨κ°•), G(초둝), B(νŒŒλž‘) 쀑 ν•˜λ‚˜λ₯Ό μƒ‰μΉ ν•œ 그림이 μžˆλ‹€. 그림은 λͺ‡ 개의 κ΅¬μ—­μœΌλ‘œ λ‚˜λ‰˜μ–΄μ Έ μžˆλŠ”λ°,

ꡬ역은 같은 μƒ‰μœΌλ‘œ 이루어져 μžˆλ‹€.

또, 같은 색상이 μƒν•˜μ’Œμš°λ‘œ 인접해 μžˆλŠ” κ²½μš°μ— 두 κΈ€μžλŠ” 같은 ꡬ역에 μ†ν•œλ‹€. (μƒ‰μƒμ˜ 차이λ₯Ό 거의 λŠλΌμ§€ λͺ»ν•˜λŠ” κ²½μš°λ„ 같은 색상이라 ν•œλ‹€)

예λ₯Ό λ“€μ–΄, 그림이 μ•„λž˜μ™€ 같은 κ²½μš°μ—

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

적둝색약이 μ•„λ‹Œ μ‚¬λžŒμ΄ 봀을 λ•Œ κ΅¬μ—­μ˜ μˆ˜λŠ” 총 4κ°œμ΄λ‹€. (λΉ¨κ°• 2, νŒŒλž‘ 1, 초둝 1) ν•˜μ§€λ§Œ,

적둝색약인 μ‚¬λžŒμ€ ꡬ역을 3개 λ³Ό 수 μžˆλ‹€. (λΉ¨κ°•-초둝 2, νŒŒλž‘ 1)

그림이 μž…λ ₯으둜 μ£Όμ–΄μ‘Œμ„ λ•Œ, 적둝색약인 μ‚¬λžŒμ΄ 봀을 λ•Œμ™€ μ•„λ‹Œ μ‚¬λžŒμ΄ 봀을 λ•Œ κ΅¬μ—­μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ” 접근법

Q.10026 적둝색약 문제 ν’€μ΄μž…λ‹ˆλ‹€.

N*N κ·Έλ¦¬λ“œμ˜ 각 μΉΈλ§ˆλ‹€ R(λΉ¨) G(초) B(파) 둜 색이 μΉ ν•΄μ Έ μžˆμ„ λ•Œ

μƒ‰μƒμœΌλ‘œ 인해 κ·Έλ¦Όμ—μ„œ λ‚˜λ‰˜λŠ” κ΅¬μ—­μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” 문제 μž…λ‹ˆλ‹€.

bfs / dfs νƒμƒ‰μœΌλ‘œ 문제 풀이가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

bfs / dfs 탐색을 톡해 같은 색상인 κ΅¬μ—­λ“€μ˜ 개수λ₯Ό κ΅¬ν•˜λ©΄

닡을 λ„μΆœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

단, 일반적인 κ²½μš°μ™€ 적둝색약 인 μ‚¬λžŒμ˜ κ²½μš°λ„ κ΅¬ν•΄μ•Όν•˜λ―€λ‘œ

μž…λ ₯을 받을 λ•Œ κ·ΈλŒ€λ‘œ λ°›λŠ” 일반적인 κ²½μš°μ™€

적둝색약 κ²½μš°μ—λŠ” λΉ¨κ°•κ³Ό μ΄ˆλ‘μƒ‰μ„ κ°™κ²Œ λ΄μ•Όν•˜λ―€λ‘œ

빨강인 경우λ₯Ό μ΄ˆλ‘μƒ‰μœΌλ‘œ μž…λ ₯ν•΄μ€λ‹ˆλ‹€.

κ·Έλž˜μ„œ

일반적인 κ²½μš°μ™€ 적둝색약인 경우의 N*N κ·Έλ¦¬λ“œλ₯Ό

탐색해주면

닡을 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’» μ½”λ“œ

package problem.bfsdfs;

import java.io.*;

public class Main_10026 {
    static int n;
    static boolean [][] visited;
    static char [][] arr1;
    static char [][] arr2;
    static int moveX[] = {0,0,-1,1};
    static int moveY[] = {-1,1,0,0};
    static char currentColor;
    static int currentCount=0;

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

        solve(arr1);
        solve(arr2);

        bw.flush();
        bw.close();
    }
    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        visited = new boolean[n][n];
        arr1 = new char[n][n];
        arr2 = new char[n][n];

        for(int i=0; i<n; i++){
            String temp[] = br.readLine().split("");
            for(int j=0; j<n; j++){
                char currentChar = temp[j].charAt(0);
                arr1[i][j] = currentChar;
                if(currentChar == 'R'){
                    currentChar = 'G';
                }
                arr2[i][j] = currentChar;
            }
        }
        br.close();
    }

    public static void dfs(int x, int y, char[][] target){
        visited[x][y] = true;
        for(int i=0; i<4; i++){
            int currentX = x+moveX[i];
            int currentY = y+moveY[i];

            if ( currentX < 0 || currentY< 0 || currentX>=n || currentY>=n)
                continue;

            if(currentColor == target[currentX][currentY] && !visited[currentX][currentY]){
                dfs(currentX,currentY,target);
            }
        }
    }

    public static void solve(char[][] target){
        currentCount = 0;
        visited = new boolean[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(!visited[i][j]){
                    currentColor = target[i][j];
                    dfs(i,j,target);
                    currentCount++;
                }
            }
        }
        System.out.println(currentCount);
    }
}
Written on March 2, 2021