[ 다먹살 ]/- Coding

[백준] 10026 적록색약

엉망으로살기 2021. 11. 16. 14:28
반응형

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

 

10026번: 적록색약

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

www.acmicpc.net

 

최대 제한길이가 100이기 때문에 이런 문제는 내 생각에 DFS, BFS 전부 상관없을 것 같다고 생각한다. 어쨌든 최단 경로가 아니라 전체적인 범위나 영역을 구하는 문제이므로 BFS가 더 잘맞다고 생각했다. 그림 값 구분('R', 'G', 'B' 등)에 의한 조건 부분을 빼면 일반적인 그래프 탐색을 활용한 문제였다.


문제 및 입출력


코드

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main
{
    // 상하좌우 탐색을 위한 배열
    static int[][] direct = new int[][]{{1,0},{0,1},{-1,0},{0,-1}};
    
    // BFS 실행을 통한 그래프 탐색처리
    public static int makeDepart(char[][] pic, boolean[][] visit, int y, int x, int n, char color)
    {
        Queue<int[]> q = new LinkedList<int[]>();
        q.add(new int[]{y,x});
        visit[y][x] = true;
        
        while(!q.isEmpty())
        {
            int[] temp = q.poll();
            int nowY = temp[0];
            int nowX = temp[1];
            
            for(int i=0; i<direct.length; i++)
            {
                nowY += direct[i][0];
                nowX += direct[i][1];
                
                if(nowY>=0 && nowY<n && nowX>=0 && nowX<n && !visit[nowY][nowX] && pic[nowY][nowX]==color)
                {
                    visit[nowY][nowX] = true;
                    q.add(new int[]{nowY, nowX});
                }
                
                nowY -= direct[i][0];
                nowX -= direct[i][1];
            }
        }
        
        // 실행좌표를 기준으로 BFS가 끝나면 결과값 리턴
        return 1;
    }
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        // 정상인 사람이 그림을 볼 때 변수
        char[][] pic = new char[n][n];
        char[][] notDepartPic = pic.clone();
        // 적록색약인 사람이 그림을 볼 때의 변수
        boolean[][] visit = new boolean[n][n];
        boolean[][] notDepartVisit = visit.clone();
        
        int canDepart = 0;
        int notDepart = 0;
        
        // 그림에 대한 입력값 처리
        for(int i=0; i<n; i++)
        {
            String temp = sc.next();
            
            for(int j=0; j<temp.length(); j++)
            {
                pic[i][j] = temp.charAt(j);
            }
        }
        // 정상인 사람이 그림을 볼 때의 영역구분
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(!visit[i][j])
                {
                    canDepart += makeDepart(pic, visit, i, j, n, pic[i][j]);
                }
            }
        }
        // 적록색약인 사람은 G와 R 구분을 못하기 때문에 전부 변경하고 방문 배열은 초기화
        for(int i=0; i<n; i++)
        {
            Arrays.fill(notDepartVisit[i], false);
            
            for(int j=0; j<n; j++)
            {
                if(notDepartPic[i][j]=='G')
                {
                    notDepartPic[i][j] ='R';
                }
            }
        }
        // 적록색약인 사람이 그림을 볼 때의 영역구분
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(!notDepartVisit[i][j])
                {
                    notDepart += makeDepart(notDepartPic, notDepartVisit, i, j, n, notDepartPic[i][j]);
                }
            }
        }
        
        System.out.println(canDepart + " " + notDepart);
        sc.close();
    }
}

 

 

반응형