프로그래머스 코딩테스트 연습/Level2
[프로그래머스][JAVA] 카카오프렌즈 컬러링북
긷뚜
2021. 5. 6. 12:27
728x90
programmers.co.kr/learn/courses/30/lessons/1829
코딩테스트 연습 - 카카오프렌즈 컬러링북
6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]
programmers.co.kr
동적 계획법으로 풀었다
방문 확인을 위해 picture배열과 같은 크기의 boolean 타입의 배열 visit 을 만들고
picture배열을 확인하며 0이 아니면서 위치의 visit 배열이 false일때 DP 함수를 돌렸다
DP함수에서는 상하좌우로 움직이며 방문 표시와 함께 총 넓이를 저장 해줬고
연산이 끝나면 기존에 있던 최대 넓이를 의미하는 변수인 maxCount와 Max 비교와
영역 개수를 의미하는 areaCount값을 1씩 더해줬다
import java.lang.Math;
class Solution {
private static int X;
private static int Y;
public int[] solution(int m, int n, int[][] picture) {
int[] answer = new int[2];
int maxCount = 0; //최대 넓이 영역의 넓이
int areaCount = 0; //영역 개수
Y = m;
X = n;
boolean[][] visit = new boolean[m][n];
for(int i =0;i<m;i++){
for(int j=0;j<n;j++){
int temp = DP(picture,visit,j,i,picture[i][j]);
if(temp >0){
areaCount++;
maxCount = Math.max(temp,maxCount);
}
}
}
answer[0] = areaCount;
answer[1] = maxCount;
return answer;
}
public int DP(int[][] picture, boolean[][] visit, int x, int y,int target){
if(x==-1||y==-1||x==X||y==Y||target==0){return 0;}
if(visit[y][x]||picture[y][x]==0||picture[y][x]!=target){
return 0;
}
int result = 1;
visit[y][x] = true;
result +=DP(picture,visit,x-1,y,target); //좌
result +=DP(picture,visit,x+1,y,target); //우
result +=DP(picture,visit,x,y-1,target); //상
result +=DP(picture,visit,x,y+1,target); //하
return result;
}
}
728x90