몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 카카오프렌즈 컬러링북 {언어 : Java} 본문

알고리즘

프로그래머스 [Lv. 2] 카카오프렌즈 컬러링북 {언어 : Java}

스위태니 2024. 5. 31. 02:01

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

import java.util.Deque;
import java.util.ArrayDeque;

class Solution {
    public boolean isValid(int nr, int nc, int n, int m) {
        return 0 <= nr && nr < n && 0 <= nc && nc < m;
    }
    
    public int[] solution(int n, int m, int[][] picture) {
        int numberOfArea = 0;
        int maxSizeOfOneArea = 0;
        
        int[][] visited = new int[n][m];
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        
        for (int sr = 0; sr < n; sr++) {
            for (int sc = 0; sc < m; sc++) {
                if (visited[sr][sc] == 1 || picture[sr][sc] == 0) {
                    continue;
                }
                numberOfArea += 1;
                int color = picture[sr][sc];
                int cnt = 1;
                visited[sr][sc] = 1;
                Deque<Integer[]> deque = new ArrayDeque<>();
                // 주의
                // deque.addLast([sr, sc]);
                deque.addLast(new Integer[] { sr, sc });
                while (!deque.isEmpty()) {
                    Integer [] tmp = deque.removeFirst();
                    int r = tmp[0];
                    int c = tmp[1];
                    for (int[] direction : directions) {
                        int nr = r + direction[0];
                        int nc = c + direction[1];
                        if (isValid(nr, nc, n, m) && picture[nr][nc] == color && visited[nr][nc] == 0) {
                            visited[nr][nc] = 1;
                            deque.addLast(new Integer[] { nr, nc });
                            cnt += 1;
                        }
                    }
                }
                if (cnt > maxSizeOfOneArea) {
                    maxSizeOfOneArea = cnt;
                }
            }
        }
        
        int[] answer = new int[2];
        answer[0] = numberOfArea;
        answer[1] = maxSizeOfOneArea;
        return answer;
    }
}

풀이 방법

  • 기본적인 bfs와 같다.
  • 현재 지점이 색이 칠해져 있는지 확인한다.
  • 방문했는지 확인한다.
  • 현재 지점의 색과 같은 색인지 확인한다.
  • 범위를 벗어났는지 확인한다.

느낀점

  • 쉽긴 한데 아직 java에 익숙하지 않아서 더 많이 풀어봐야 할 것 같다.
  • Deque<Integer[]> deque = new ArrayDeque<>(); => 덱 만들기
  • deque.addLast(new Integer[] {nr, nc}); => 덱에 배열 넣기
  • Integer[] tmp = deque.removeFirst(); => 덱에서 맨 앞 원소 추출하기
  • deque.isEmpty(); => 배열이 비었는지 확인하기