Algorithm

[Algorithm/Java][프로그래머스] 카카오프렌즈 컬러링북

kkmin223 2022. 2. 17. 17:52
반응형

[프로그래머스] 카카오프렌즈 컬러링북

https://programmers.co.kr/learn/courses/30/lessons/1829

문제접근

BFS를 이용해서 같은 색상을 가진 인접한 노드들을 탐색하고 영역과 영역의 크기를 구하였다.
그리고 좌표값과 해당 좌표의 색상 정보를 가진 XY클래스를 만들어서 Queue를 이용할 때 편하도록 하였다.

Code

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    class XY {
        int x;
        int y;
        int value; // 해당 좌표의 그림
        XY(){};
        XY(int x, int y, int value){
            this.x = x;
            this.y = y;
            this.value = value;
        }
    }
    boolean isIn(int x, int y, int m, int n){
        // 영역을 벗어나는지 검사하는 함수
        return (x <0 || x>=m || y < 0 || y >=n);
    }
    public int[] solution(int m, int n, int[][] picture) {
        int numberOfArea = 0;
        int maxSizeOfOneArea = 0;
        int[][] visited = new int[m][n]; //방문한 위치인지 기록(1이면 이미 방문한 위치)
        int[] dx = {-1,1,0,0};
        int[] dy = {0,0,-1,1};
        Queue<XY> q = new LinkedList<>();
        for(int i = 0; i<m; i++){
            for(int j = 0; j<n; j++){
                int size=0;
                if(picture[i][j] != 0 && visited[i][j]==0){
                    q.add(new XY(i,j,picture[i][j]));
                    visited[i][j] = 1;
                    numberOfArea++;
                }
                while(!q.isEmpty()){
                    // BFS를 사용하여 영역 찾기
                    XY cur = q.poll();
                    size++;
                    for(int k =0; k<4; k++){
                        // dx, dy를 이용하여 현재 위치의 상하좌우를 탐색
                        int next_x = cur.x + dx[k];
                        int next_y = cur.y + dy[k];
                        if(isIn(next_x, next_y, m, n)){
                            continue;
                        }
                        int next_v = picture[next_x][next_y];
                        if(next_v == cur.value 
                           && visited[next_x][next_y]==0){
                            q.add(new XY(next_x,next_y, next_v));
                            visited[next_x][next_y] = 1;
                        }
                    }
                }
                if(size > maxSizeOfOneArea) maxSizeOfOneArea = size;
            }
        }
        int[] answer = new int[2];
        answer[0] = numberOfArea;
        answer[1] = maxSizeOfOneArea;
        return answer;
    }
}

어려웠던 점 / 배운 점 / 느낀 점

문제를 보고 BFS를 떠올리긴 했지만, 어디서 큐에 데이터를 추가할 지 어떻게 탐색할 지는 조금 고민을 했던 것 같다.
그리고 인덱스를 벗어난 에러가 떠서 isIn 메소드를 추가하였고, 다른 부분들도 메소드로 빼려고 했으나, BFS 부분을 메소드로 만들려면 너무 많은 변수들을 매개변수로 해줘야해서 안하는게 더 깔끔한 것 같다.(필요성을 못 느끼겠다.)

반응형