Algorithm/BOJ(Baekjoon Online Judge)

[백준 - 10026번] 적록색약 - Java //Wello Horld//

koucop 2019. 12. 9. 13:21

이번에는 BOJ의 10026번 문제 "적록색약" 을 풀어보도록 하자

NXN의 크기만큼 빨강, 초록, 파랑 중 하나를 색칠한 그림이 주어지고, 해당그림이 몇개의 구역으로 나뉘어져 있는지 적록색약이 아닌 사람이 봤을 경우와 적록색약인 사람이 봤을 경우에 대해 구하면 되는 문제이다.

성공한 코드는 아래와 같다

import java.io.*;
import java.util.*;

public class sample {
    static int ansRGB = 0;
    static int ansRB = 0;
    static int N;
    static char[][] RGB;
    static char[][] RB;
    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());
        RGB = new char[N][N];
        RB = new char[N][N];
        for(int i = 0; i < N; i++){
            String input = br.readLine();
            for(int j = 0; j < N; j++){
                RGB[i][j] = input.charAt(j);
                if(input.charAt(j) == 'G') RB[i][j] = 'R';
                else RB[i][j] = input.charAt(j);
            }
        }
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                if(RGB[i][j] != '.') {
                    ansRGB++;
                    calcRGB(i, j, RGB[i][j]);
                }
            }
        }
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                if(RB[i][j] != '.') {
                    ansRB++;
                    calcRB(i, j, RB[i][j]);
                }
            }
        }
        bw.write(ansRGB + " " + ansRB + "\n");

        bw.flush();
        br.close();
        bw.close();
    }
    public static void calcRGB(int n, int m, char c){
        if(n < 0 || n >= N || m < 0 || m >= N || RGB[n][m] == '.') return;
        if((c == 'R' && RGB[n][m] == 'R') || c == 'B' && RGB[n][m] == 'B' || c == 'G' && RGB[n][m] == 'G'){
            RGB[n][m] = '.';
            calcRGB(n, m - 1, c);
            calcRGB(n, m + 1, c);
            calcRGB(n - 1, m, c);
            calcRGB(n + 1, m, c);
        }
    }
    public static void calcRB(int n, int m, char c){
        if(n < 0 || n >= N || m < 0 || m >= N || RB[n][m] == '.') return;
        if((c == 'R' && RB[n][m] == 'R') || c == 'B' && RB[n][m] == 'B' || c == 'G' && RB[n][m] == 'G'){
            RB[n][m] = '.';
            calcRB(n, m - 1, c);
            calcRB(n, m + 1, c);
            calcRB(n - 1, m, c);
            calcRB(n + 1, m, c);
        }
    }
}

 

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

 

10026번: 적록색약

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

www.acmicpc.net

 

혹시 코드에 이상한 부분이나 틀린 부분이 있던지, 이해가 안가는 부분이 있다면 댓글로 알려주세요.