https://leetcode.com/problems/count-square-submatrices-with-all-ones(리트코드)
동적계획법
동적계획법을 활용한 풀이
class Solution {
public int countSquares(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
int[][] dp = new int[row][col]; // 원본과 똑같은 크기의 배열을 생성한다.
int count = 0 ;
//첫 행과 첫 열을 초기화한다.
//첫 행부분 초기화
for(int i = 0 ; i< row ; i++) {
dp[i][0] = matrix[i][0];
count += dp[i][0]; //1인 경우 하나의 스퀘어이므로 더함 (0은 더해도 0)
}
//첫 열부분 초기화 (j=0은 이미 i=0으로 처리했으니까)
for(int j = 1; j < col ; j++) {
dp[0][j] = matrix[0][j];
count += dp[0][j];
}
//dp배열 채우기
for(int i = 1 ; i<row; i++) {
for(int j = 1 ; j<col; j++) {
if(matrix[i][j] == 1) {
dp[i][j] = Math.min( Math.min(dp[i-1][j] , dp[i][j-1]) , dp[i-1][j-1] ) + 1;
count += dp[i][j];
}
}
}
return count;
}
}
matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
dp =
[
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
]
//첫 행부분 초기화
for(int i = 0 ; i< row ; i++) {
dp[i][0] = matrix[i][0];
count += dp[i][0]; //1인 경우 하나의 스퀘어이므로 더함 (0은 더해도 0)
}
//첫 열부분 초기화 (j=0은 이미 i=0으로 처리했으니까)
for(int j = 1; j < col ; j++) {
dp[0][j] = matrix[0][j];
count += dp[0][j];
}
위 코드를 통해 matrix와 동일한 크기로 구현한 dp배열에 첫행과 첫열을 초기화한다.
이때 1인 경우는 정사각형이 하나인 경우를 의미하므로 각각 count를 더하다.
dp =
[
[0, 1, 1, 1],
[1, 0, 0, 0],
[0, 0, 0, 0]
]
이후 (1,1) 부터 반복적으로 돌면서 데이터를 확인한다.
//dp배열 채우기
for(int i = 1 ; i<row; i++) {
for(int j = 1 ; j<col; j++) {
if(matrix[i][j] == 1) {
dp[i][j] = Math.min( Math.min(dp[i-1][j] , dp[i][j-1]) , dp[i-1][j-1] ) + 1;
count += dp[i][j];
}
}
}
dp[1][1] = min(0 , 1 , 1 ) + 1 을 함으로써 1이 저장된다.
이 뜻은 정사각형 내에 0이 하나라도 있기 때문에 크기가 2인 정사각형은 없지만
matrix[i][j] 자체가 1이므로 크기가 1인 정사각혀잉 있으므로 1이 저장된다.
dp[1][2] = min( 1, 1, 1 ) + 1 이므로 2가 저장된다.
이 뜻은 크기가 1인경우 자체적으로 1이 저장되며 추가적으로 크기가 2인 경우에도
min이 1이므로 모두 1인 정사각형을 의미한다.
dp[1][3] = min( 1, 1, 1 ) + 1 이므로 2가 저장된다.
이 뜻은 크기가 1인경우 자체적으로 1이 저장되며 추가적으로 크기가 2인 경우에도
min이 1이므로 모두 1인 정사각형을 의미한다.
dp =
[
[0, 1, 1, 1],
[1, 1, 2, 2], --2의 의미는 n=1일때 , n=2일때 정사각형 개수
[0, 0, 0, 0]
]
dp[2][1] = min( 1, 1, 0 ) + 1 이므로 1이 저장된다.
dp[2][2] = min( 1, 1, 1 ) + 1 이므로 1이 저장된다.
dp[2][3] = min(2 , 2 , 2 ) + 1 이므로 3이 저장된다.
이 뜻은 n=1 일때 1개 , n=2일때 1개 , n=3일때 정사각형이 된다는 의미다.
만약 min으로 통해 0이 나왔다면 n=2이상일때 정사각형이 성립될 수 없다.
dp =
[
[0, 1, 1, 1],
[1, 1, 2, 2],
[0, 1, 2, 3]
]
동적계획법..너무 어렵다.
대신 문제를 풀면서 원리를 하나하나 헤쳐가면서 풀이법을 복기하고 기억하면서
손에 익혀야겠다.
#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL