카테고리 없음

[백준/Java] 적록색약 10026

해버니 2023. 12. 22. 15:49
반응형

 

 

 

문제

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

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

 

 

 

 

 

 

 

 

 

 

 

풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static String[][] paint;
    public static boolean[][] check;
    public static int count;
    public static int[] dx = {0, -1, 0, 1};
    public static int[] dy = {-1, 0, 1, 0};

    /**
     * 적록색약이 아닌 경우
     * 
     * @param x
     * @param y
     * @param color
     */
    public void notDyschromatopsia(int x, int y, String color) {
        check[x][y] = true;

        for (int i = 0; i < dx.length; i++) {

            int cx = x + dx[i];
            int cy = y + dy[i];

            if (cx >= 0 && cy >= 0 && cx < paint.length && cy < paint.length) {
                if (color.equals(paint[cx][cy]) && check[cx][cy] == false) {
                    notDyschromatopsia(cx, cy, paint[cx][cy]);
                }
            }
        }
    }

    /**
     * 적록색약일 경우
     * 
     * @param x
     * @param y
     * @param color
     */
    public void dyschromatopsia(int x, int y, String color) {
        check[x][y] = true;

        for (int i = 0; i < dx.length; i++) {
            int cx = x + dx[i];
            int cy = y + dy[i];

            if (cx >= 0 && cy >= 0 && cx < paint.length && cy < paint.length) {
                if ((color.equals(paint[cx][cy]) || (color.equals("G") && paint[cx][cy].equals("R"))
                                || (color.equals("R") && paint[cx][cy].equals("G"))) && check[cx][cy] == false) {
                    dyschromatopsia(cx, cy, paint[cx][cy]);
                }

            }
        }

    }

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

        Main mm = new Main();

        int n = Integer.parseInt(br.readLine());
        paint = new String[n][n];
        check = new boolean[n][n];

        // 입력 받기
        for (int i = 0; i < paint.length; i++) {
            String inputStr = br.readLine();
            for (int j = 0; j < paint[0].length; j++) {
                paint[i][j] = String.valueOf(inputStr.charAt(j));
            }
        }


        // false 초기화
        for (int i = 0; i < check.length; i++) {
            for (int j = 0; j < check[0].length; j++) {
                check[i][j] = false;
            }
        }
        count = 0; // count 초기화

        for (int i = 0; i < paint.length; i++) {
            for (int j = 0; j < paint[0].length; j++) {
                if (check[i][j] == false) {
                    count++;
                    // System.out.println("i :" + i + " j :" + j);
                    mm.notDyschromatopsia(i, j, paint[i][j]);
                }
            }
        }
        bw.write(String.valueOf(count) + " ");

        count = 0; // count 초기화
        // false 초기화
        for (int i = 0; i < check.length; i++) {
            for (int j = 0; j < check[0].length; j++) {
                check[i][j] = false;
            }
        }

        for (int i = 0; i < paint.length; i++) {
            for (int j = 0; j < paint[0].length; j++) {
                if (check[i][j] == false) {
                    count++;
                    mm.dyschromatopsia(i, j, paint[i][j]);
                }
            }
        }

        bw.write(String.valueOf(count));

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

 

 

 

 

 

 

 

정답

 

 

 

 

 

 

반응형