알고리즘/백준 풀이

[백준 2167] 2차원 배열의 합

전태경 2018. 12. 19. 19:10

문제 출처 : https://www.acmicpc.net/problem/2167


문제 요약


  • 정보가 담긴 2차원 배열이 주어진다.
  • 2차원 배열 내에 주어진 구간의 합을 구하는 문제이다.


문제 풀이


이 문제는 동적 계획법을 사용하여 부분(구간)합을 구하는 문제이다. 


여기서 부분합이란 ??



배열 정보

 4

 2

 3



부분합 배열

 10

 12

 15

 19


이와 같이 자신의 위치를 포함하여 이전의 값들의 합(누적합)을 배열에 저장해두는 것이다. 

이 원리를 확장하여 2차원 배열에 적용을 한 것이 이 문제의 핵심이다.



 (0, 0)

 

 

 

 

 

  (a, b)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 (n-1,m-1)


이와 같은 2차원 배열의 정보를 Dp(i, j) : (0,0) 부터 (i, j) 까지의 합을 저장해두자. 


하지만 좌측상단의 시작이 (0,0) 아니라면 ?? 


만약, (a, b)에서 (n-1, m-1)까지의 부분합을 구해야한다고 하면 (문제의 요구) 우리는 집합의 개념을 가져올 수 있다.


즉, 구간합(a,b, n-1, m-1) : dp(n-1, m-1) - dp(a-1, m-1) - dp(n-1, b-1) + dp(a-1, b-1) 과 같이 표현할 수 있다.





이처럼 파란색 구간을 구하기 위해 빨간색 2구간을 빼준 뒤, 초록 구간을 한 번 더 해준다. 이유는


초록구간이 두 번 빼졌기 때문이다. 합집합의 공식을 생각하면 이해하기 쉽다.