백준 10026 적록색약 Java

2023. 1. 27. 12:20· 알고리즘/BeakJoon

일반인과 적록색약을 가지고 있는 사람의 두가지 경우를 나누어서 dfs를 짜면 어렵지 않게 풀 수 있는 문제였다.

코드에 주석을 자세하게 달아놓았다.

package Beakjoon;

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

public class Main_10026 {
    
    /*
    적록색약 -> 빨강과 초록을 동일하게 인식
    일반인과 적록색약이 보는 구역의 수를 각각 구하기
    일반인 -> 빨강, 파랑, 초록
    적록색약 -> 빨강+초록, 파랑
     */

    static int N; //배열 크기
    static char [][] arr;
    static boolean [][] visited;
    static boolean [][] colorVisited;
    static int [] dx = {0, 1, 0, -1};
    static int [] dy = {1, 0, -1, 0};


    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //문자로 입력 받기 때문에 string으로 받고
        //하나씩 잘라서 배열에 넣자
        N = Integer.parseInt(br.readLine());
        arr = new char [N][N];
        visited = new boolean [N][N];
        colorVisited = new boolean [N][N];

        //배열 입력받기기
       for(int i=0; i<N; i++){
            String s = br.readLine();
            for (int j = 0; j < N; j++) {
                arr[i][j] = s.charAt(j);
            }
        }
       
       int cnt = 0; //일반 사람
        int colorCnt = 0; //적록색약

       //적록색약인 경우와
        //일반의 경우를
        //각각 dfs를 돌려서 cnt를 세어주자자

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                //일반 사람
                //방문하지 않았다면 dfs 시작
                if(!visited[i][j]){
                    cnt++;
                    dfs(i, j, arr[i][j]);
                }
                //적록색약의 경우
                //방문하지 않았다면 colorDfs 시작
                if(!colorVisited[i][j]){
                    colorCnt++;
                    colorDfs(i, j, arr[i][j]);
                }
            }

        }

        System.out.println(cnt+ " "+ colorCnt);


   }

   public static void dfs(int x, int y, char c){
        //시작하자마자 방문처리
        visited[x][y] = true;
        for(int idx=0; idx<4; idx++) {
            int nx = x + dx[idx];
            int ny = y + dy[idx];
            //범위체크
            if(nx>=0 && nx <N && ny >= 0 && ny < N){
                //각각의 경우마다 dfs를 돈다
                //시작점의 색과 같으면 탐색을 시작한다
                if(!visited[nx][ny] && arr[nx][ny] == c) {
                    dfs(nx, ny, c);
                }
            }
        }
   }

    public static void colorDfs(int x, int y, char c){
        colorVisited[x][y] =true;
        //시작점에서 4방탐색을 해서
        //색을 판단하자
        for(int idx=0; idx<4; idx++){
            int nx = x + dx[idx];
            int ny = y + dy[idx];
            //범위체크
            if(nx >= 0 && nx < N && ny >= 0 && ny < N){
                //방문체크
                if(!colorVisited[nx][ny]) {
                    //색 체크
                    //적록색약인 경우에는 R과 G를 따라서 DFS를 돈다
                    if(c == 'R' || c =='G'){
                        //4방 탐색해서 해당 색이 있는 경우
                        if (arr[nx][ny] == 'R' || arr[nx][ny] == 'G') {
                                    colorDfs(nx, ny, c);
                             }
                    }
                    //R과 G를 제외한 B의 경우에서
                    //DFS를 돈다
                    else {
                        if(arr[nx][ny] == c){
                            colorDfs(nx, ny, c);
                        }
                    }
                }
            }
        }
    }
}
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > BeakJoon' 카테고리의 다른 글

백준 9205 맥주 마시면서 걸어가기 Java  (2) 2023.02.02
백준 2583 영역 구하기 Java  (0) 2023.01.30
백준 2573 빙산 Java  (0) 2023.01.26
백준 2636 치즈 Java  (0) 2023.01.26
백준 5014 스타트링크 Java  (0) 2023.01.20
'알고리즘/BeakJoon' 카테고리의 다른 글
  • 백준 9205 맥주 마시면서 걸어가기 Java
  • 백준 2583 영역 구하기 Java
  • 백준 2573 빙산 Java
  • 백준 2636 치즈 Java
개발자 정지은
개발자 정지은
프로그래밍 공부 기록
개발자 정지은
PROGRAMMING DIARY
개발자 정지은
전체
오늘
어제
  • 분류 전체보기 (107)
    • 알고리즘 (49)
      • BeakJoon (27)
      • SWEA (9)
      • Inflearn (2)
      • CodeSignal (1)
      • Programmers (10)
    • FE (0)
      • Javascript (0)
      • React (0)
    • BE (0)
    • CS공부 (13)
      • Database (7)
      • IT기본지식 (6)
    • TIL (45)
      • 프로그래머스 데브코스 (45)
    • Project (0)
      • DreamHi (0)
      • 인사관리시스템 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • javascript
  • 알고리즘
  • figma
  • 국비지원교육
  • 리액트
  • 프론트엔드
  • 자바스크립트
  • ReactNative
  • 프로그래머스 데브코스
  • 코딩부트캠프
  • 피그마
  • React.JS

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
개발자 정지은
백준 10026 적록색약 Java
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.