프로그래머스 카카오 프렌즈 컬러링북 (Java,자바)

jonghyukLee·2022년 5월 12일
0

이번에 풀어본 문제는
프로그래머스 카카오 프렌즈 컬러링북 입니다.

📕 문제 링크

❗️코드

import java.util.*;

class Area
{
    int x,y;

    public Area(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
class Solution {
    static int M,N,max;
    public int[] solution(int m, int n, int[][] picture) {
        M = m;
        N = n;
        max = Integer.MIN_VALUE;
        Queue<Area> q = new LinkedList<>();
        boolean [][] visited = new boolean[m][n];
        int [] dx = {-1,1,0,0};
        int [] dy = {0,0,-1,1};
        int areaCnt = 0;
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if(picture[i][j] > 0 && !visited[i][j])
                {
                    areaCnt++;
                    int tmpSize = 1,curColor = picture[i][j];
                    visited[i][j] = true;
                    q.add(new Area(i,j));
                    while(!q.isEmpty())
                    {
                        Area cur = q.poll();
                        for(int idx = 0; idx < 4; idx++)
                        {
                            int mx = cur.x + dx[idx];
                            int my = cur.y + dy[idx];

                            if(!isValid(mx,my) || picture[mx][my] != curColor || visited[mx][my]) continue;
                            visited[mx][my] = true;
                            tmpSize++;
                            q.add(new Area(mx,my));
                        }
                    }
                    max = Math.max(max,tmpSize);
                }
            }
        }
        return new int[] {areaCnt,max};
    }
    static boolean isValid(int x, int y)
    {
        return x >= 0 && y >= 0 && x < M && y < N;
    }
}

📝 풀이

상하좌우로 인접한 영역의 개수와, 영역들 중 가장 넓은 영역의 크기를 구하는 문제입니다.
bfs 또는 dfs 탐색으로 각 영역의 크기와 개수를 카운트해주면 해결할 수 있습니다.

📜 후기

이유는 모르겠지만, 이 문제는 전역변수를 사용할 때 솔루션함수 내에서 초기화를 시켜줘야 하네요..
계속 틀리다는 결과가 나와서 한참 헤맸습니다 ㅠ

profile
머무르지 않기!

0개의 댓글