본문 바로가기
백준(Java)/23년 10월

[Java] 백준 - 10026번: 적록색약

by C0MPAS 2023. 10. 18.

10월 18일(수) - 그래프와 순회 (10026번)

 

10026번: 적록색약

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

(C언어 풀이 활용)

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

public class Main {
    static int N;

    static String str;
    static char[][] arr;
    static int[][] visited;
    static int dx[] = {-1, 1, 0, 0};
    static int dy[] = {0, 0, -1, 1};

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

        N = Integer.parseInt(br.readLine());
        arr = new char[N+1][N+1];
        visited = new int[N+1][N+1];

        for(int i=0; i<N; i++)
        {
            str = br.readLine();

            for(int j=0; j<N; j++)
            {
                arr[i][j] = str.charAt(j);
            }
        }

        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                if(arr[i][j] == 'R')
                {
                    arr[i][j] = 1;
                }
                else if(arr[i][j] == 'G')
                {
                    arr[i][j] = 2;
                }
                else
                {
                    arr[i][j] = 3;
                }
            }
        }

        int red = 0;
        int green = 0;
        int blue = 0;
        int red_green = 0;

        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                if(arr[i][j] == 1 && visited[i][j] == 0)
                {
                    dfs(i,j,1);
                    red++;
                }
                if(arr[i][j] == 2 && visited[i][j] == 0)
                {
                    dfs(i,j,2);
                    green++;
                }
                if(arr[i][j] == 3 && visited[i][j] == 0)
                {
                    dfs(i,j,3);
                    blue++;
                }
            }
        }

        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                visited[i][j] = 0;
            }
        }

        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
            {
                if((arr[i][j] == 1 || arr[i][j] == 2) && visited[i][j] == 0)
                {
                    red_green_blind(i, j);
                    red_green++;
                }
            }
        }

        int normal = red + green + blue;
        int blind = red_green + blue;
        System.out.print(normal + " " + blind);
    }

    static void dfs(int y, int x, int color){
        visited[y][x] = 1;

        for(int i=0; i<4; i++)
        {
            int next_x = x + dx[i];
            int next_y = y + dy[i];

            if(next_x<0 || next_y<0 || next_x>=N || next_y>= N)
            {
                continue;
            }
            if(arr[next_y][next_x] == color && visited[next_y][next_x] == 0)
            {
                dfs(next_y, next_x, color);
            }
        }
    }

    static void red_green_blind(int y, int x){
        visited[y][x] = 1;

        for(int i=0; i<4; i++)
        {
            int next_x = x + dx[i];
            int next_y = y + dy[i];

            if(next_x<0 || next_y<0 || next_x>=N || next_y>= N)
            {
                continue;
            }
            if((arr[next_y][next_x] == 1 || arr[next_y][next_x] == 2) && visited[next_y][next_x] == 0)
            {
                red_green_blind(next_y, next_x);
            }
        }
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

'백준(Java) > 23년 10월' 카테고리의 다른 글

[Java] 백준 - 10610번: 30  (0) 2023.10.25
[Java] 백준 - 2193번: 이친수  (0) 2023.10.20
[Java] 백준 - 11726번: 2 x n 타일링  (0) 2023.10.09

댓글