(문제 설명)
(코드)
영역 개수 구할 때 사용하는 함수는 countArea()와 deepCountArea()
최대 영역 크기 구할 때 사용하는 함수는 maxArea()와 deepMaxArea()
이중 for문을 돌면서 재귀 함수로 각각의 index에 deep 하게 접근하는 방식을 택했다. 이때 if문의 조건이 영역 개수, 최대 영역 크기를 구하는 차이라고 보면 된다.
import java.util.*;
class Solution {
public int[] solution(int m, int n, int[][] picture) {
int numberOfArea = countArea(picture);
System.out.println(numberOfArea);
int maxSizeOfOneArea = maxArea(picture);
System.out.println(maxSizeOfOneArea);
int[] answer = new int[2];
answer[0] = numberOfArea;
answer[1] = maxSizeOfOneArea;
return answer;
}
public int countArea(int[][] picture){
boolean[][] check = new boolean[picture.length][picture[0].length];
int result = 0;
for(int i=0; i<picture.length; i++){
for(int j=0; j<picture[0].length; j++){
if(!check[i][j])
result += deepCountArea(picture, check, i, j);
}
}
return result;
}
public int deepCountArea(int[][] picture, boolean[][] check, int x, int y){
if(check[x][y] || picture[x][y] == 0)
return 0;
check[x][y] = true;
if(y<picture[0].length-1 && picture[x][y] == picture[x][y+1]) // 아래
deepCountArea(picture, check, x, y+1);
if(y>0 && picture[x][y] == picture[x][y-1]) // 위
deepCountArea(picture, check, x, y-1);
if(x<picture.length-1 && picture[x][y] == picture[x+1][y]) // 오른
deepCountArea(picture, check, x+1, y);
if(x>0 && picture[x][y] == picture[x-1][y]) // 왼
deepCountArea(picture, check, x-1, y);
return 1;
}
public int maxArea(int[][] picture){
boolean[][] check = new boolean[picture.length][picture[0].length];
int max = 0;
for(int i=0; i<picture.length; i++){
for(int j=0; j<picture[0].length; j++){
if(check[i][j] == false){
int tmp = deepMaxArea(picture, check, i, j, picture[i][j]);
max = max < tmp ? tmp : max;
}
}
}
return max;
}
public int deepMaxArea(int[][] picture, boolean[][] check, int x, int y, int before){
if(check[x][y] || picture[x][y] != before || picture[x][y] == 0)
return 0;
int count = 1;
check[x][y] = true;
if(y < picture[0].length-1) // 아래로
count += deepMaxArea(picture, check, x, y+1, picture[x][y]);
if(y > 0) // 위로
count += deepMaxArea(picture, check, x, y-1, picture[x][y]);
if(x < picture.length-1) // 오른쪽으로
count += deepMaxArea(picture, check, x+1, y, picture[x][y]);
if(x > 0) // 왼쪽으로
count += deepMaxArea(picture, check, x-1, y, picture[x][y]);
return count;
}
}
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[Python] 영어 끝말잇기 (0) | 2022.09.26 |
---|---|
[Python, JAVA] 프로그래머스 - 다음 큰 숫자 (0) | 2022.09.26 |
[JAVA] 프로그래머스 - 오픈채팅방 (시간복잡도 빅오 O(n)) (0) | 2022.03.30 |
[JAVA] 프로그래머스 - 야근지수 (0) | 2021.02.17 |
[JAVA] 프로그래머스 - 가장 긴 팰린드롬 (0) | 2021.02.16 |
댓글