코딩테스트/백준

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

GAEBAL 2022. 2. 25. 15:53
728x90

문제

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

 

10026번: 적록색약

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

www.acmicpc.net

 

풀이

내 생각에 이 문제의 포인트는 1. dfs로 구현을 할 수 있는지?, 2. 정상인 버전과, 적록색약 버전을 어떻게 따로 할지? 인 것 같음

1. map[][]과 방문 체크 배열 visited[][], 방향 벡터 등 static으로 해야할 것들 밖에다가 static으로 선언

2. 입력 받기

3. dfs 구현 - 현재 탐색 중인 구역의 색깔을 따로 저장해놨다가 다음 탐색 구역의 색깔과 같다면 탐색 ㄱㄱ

4. main 함수에서 for문을 돌면서 방문하지 않았다면 dfs 실행, count 증가

5. 정상 버전을 다했으면 map[][]의 R을 G로 바꿔서 dfs 한번 더 실행

 

코드

// 10026번 적록색약
// https://www.acmicpc.net/problem/10026

package BAEKJOON;

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

public class Num10026_적록색약 {
    static int N;
    static char[][] map;
    static boolean[][] visited;
    // 상하좌우
    static int[] dr = {-1, 1, 0, 0};
    static int[] dc = {0, 0, -1, 1};
    static int aCount = 0; // 정상
    static int bCount = 0; // 적록색약
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        map = new char[N][N];
        visited = new boolean[N][N];

        // 입력
        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            for (int j = 0; j < str.length(); j++) {
                map[i][j] = str.charAt(j);
            }
        }

//        // 테스트
//        System.out.println(Arrays.deepToString(map));

        // 정상
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                // 방문하지 않았으면 실행
                if (!visited[i][j]) {
                    dfs(i, j);
                    aCount++; // 같은 구역이면 Count++
                }
            }
        }

        // 적록색약은 R과 G가 똑같이 보이므로 R을 G로 바꿔줌
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] == 'R') {
                    map[i][j] = 'G';
                }
            }
        }

        // 적록색약은 어떻게 보이는지 알아봐야하기 때문에 방문 체크 배열 초기화
        visited = new boolean[N][N];

        // 적록색약
       for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (!visited[i][j]) {
                    dfs(i, j);
                    bCount++;
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        sb.append(aCount).append(" ").append(bCount);

        System.out.println(sb);
    }

    public static void dfs(int r,int c) {
        // 이미 방문했으면 리턴
        if (visited[r][c]) {
            return;
        }

        // 방문 체크
        visited[r][c] = true;

        // 현재색깔
        char temp = map[r][c];

        for (int i = 0; i < 4; i++) {
            int nr = r + dr[i];
            int nc = c + dc[i];

            // 범위 밖이면 나가리
            if (nr < 0 || nr >= N || nc < 0 || nc >= N || map[nr][nc] != temp) {
                continue;
            }

            // 다음 구역도 현재 구역 색과 같으면 dfs 실행
            if (map[nr][nc] == temp) {
                dfs(nr, nc);
            }
        }

    }
}
 
728x90