이 문제에서는 정수 값 mat[][]의 2D 배열이 제공됩니다. 우리의 임무는 mat의 접두사 합 행렬을 출력하는 것입니다.
접두사 합계 행렬: 행렬의 모든 요소는 위쪽과 왼쪽의 합 요소입니다. 즉
prefixSum[i][j] = mat[i][j] + mat[i-1][j]...mat[0][j] + mat[i][j-1] +... mat[i][0].
문제를 이해하기 위해 예를 들어보겠습니다.
Input: arr =[ [4 6 1] [5 7 2] [3 8 9] ] Output:[ [4 10 11] [9 22 25] [12 33 45] ]
이 문제를 해결하기 위해 한 가지 간단한 솔루션은 i,j 위치까지 모든 요소를 순회하고 추가하여 prefixSum을 찾는 것입니다. 하지만 시스템이 약간 복잡합니다.
보다 효과적인 솔루션은 prefixSum 행렬의 요소 값을 찾는 공식을 사용하는 것입니다.
ij 위치의 요소에 대한 일반 공식은 다음과 같습니다.
prefixSum[i][j] = prefixSum[i-1][j] + prefixSum[i][j-1] - prefixSum[i-1][j-1] + a[i][j]
일부 특별한 경우는
For i = j = 0, prefixSum[i][j] = a[i][j] For i = 0 and j > 0, prefixSum[i][j] = prefixSum[i][j-1] + a[i][j] For i > 0 and j = 0, prefixSum[i][j] = prefixSum[i-1][j] + a[i][j]
솔루션 구현을 보여주는 코드
예시
#include <iostream> using namespace std; #define R 3 #define C 3 void printPrefixSum(int a[][C]) { int prefixSum[R][C]; prefixSum[0][0] = a[0][0]; for (int i = 1; i < C; i++) prefixSum[0][i] = prefixSum[0][i - 1] + a[0][i]; for (int i = 0; i < R; i++) prefixSum[i][0] = prefixSum[i - 1][0] + a[i][0]; for (int i = 1; i < R; i++) { for (int j = 1; j < C; j++) prefixSum[i][j]=prefixSum[i- 1][j]+prefixSum[i][j- 1]-prefixSum[i- 1][j- 1]+a[i][j]; } for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) cout<<prefixSum[i][j]<<"\t"; cout<<endl; } } int main() { int mat[R][C] = { { 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} }; cout<<"The prefix Sum Matrix is :\n"; printPrefixSum(mat); return 0; }
출력
The prefix Sum Matrix is : 1 3 6 5 12 21 12 27 45