https://programmers.co.kr/learn/courses/30/lessons/1829
문제는 단순 bfs또는 dfs를 사용해서 최대 영역크기 저장, dfs또는 bfs를 새로 실행할 때 마다 cnt를 증가시켜 구현해주면 될 것이라 생각해 빠르게 구현하였다
하지만 테케는 통과하는데 제출 시 계속 실패가 떴다. 찾아보니 picture를 직접 건들지 말고 2차원 long 배열에 옮겨서 사용하고 전역변수 초기화 시 solution 함수 내에서 진행하라고 하더라. 이렇게 바꾸니까 통과했다.
import java.util.*;
class Solution {
static int mX[] = {1,0,-1,0};
static int mY[] = {0,1,0,-1};
static long board[][];
static int cnt;
static int size;
static int max_size;
static boolean visit[][];
public int[] solution(int m, int n, int[][] picture) {
board = new long[m][n];
max_size = Integer.MIN_VALUE;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
board[i][j] = picture[i][j];
}
}
cnt = 0;
size = 0;
visit = new boolean[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(!visit[i][j]&&board[i][j]!=0){
size=0;
cnt++;
dfs(i,j,picture[i][j]);
max_size = Math.max(size,max_size);
}
}
}
int[] answer = new int[2];
answer[0] = cnt;
answer[1] = max_size;
return answer;
}
static void dfs(int x, int y,int value){
visit[x][y] = true;
size++;
for(int i=0;i<4;i++){
int tX = x+mX[i];
int tY = y+mY[i];
if(check(tX,tY)&&!visit[tX][tY]&&board[tX][tY]==value){
dfs(tX,tY,value);
}
}
}
static boolean check(int x, int y){
if(x<0||x>=board.length||y<0||y>=board[0].length){
return false;
}
return true;
}
}