이번에 풀어본 문제는
프로그래머스 카카오 프렌즈 컬러링북 입니다.
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 탐색으로 각 영역의 크기와 개수를 카운트해주면 해결할 수 있습니다.
이유는 모르겠지만, 이 문제는 전역변수를 사용할 때 솔루션함수 내에서 초기화를 시켜줘야 하네요..
계속 틀리다는 결과가 나와서 한참 헤맸습니다 ㅠ