알고리즘/백준(acmicpc.net) 문제풀이

2167번 : 2차원 배열의 합

Mosu(정종인) 2018. 6. 6. 15:47
반응형

부분사각형을 구하는 문제다. 이 문제의 핵심은 "사각형을 어떻게 만들 것인가"이다. 

위 사각형을 보자. 왼쪽 아래 꼭지점이 원점이라고 할 때, 1번 사각형의 넓이는 어떻게 나타낼 수 있을까?

그렇다. (전체 사각형의 넓이)에서 (2번사각형+4번사각형)을 빼고 (3번사각형 + 4번사각형)을 뺀 다음 (4번사각형)을 더해주면 된다.

왜 이런 방법을 쓸까?

그 이유는 넓이를 표현하기가 쉬워서 그렇다. 

이 그림을 보면 ((0,0)은 4번사각형의 왼쪽 아래 꼭짓점을 나타냄)
1) (전체 사각형의 넓이)는 (0,0) 에서 (x,y)까지의 넓이

2) (2번사각형 + 4번사각형)은 (0,0)에서 (i, y)까지의 넓이

3) (3번사각형 + 4번사각형)은 (0,0)에서 (x, j)까지의 넓이

4) (4번사각형)은 (0.0) 에서 (i, j)까지의 넓이

가 된다.

이를 dp로 저장할 때는 

1) (전체 사각형의 넓이)는 dp[x][y]

2) (2번사각형 + 4번사각형)은 dp[i][y]

3) (3번사각형 + 4번사각형)은 dp[x][j]

4) (4번사각형)은 dp[i][j]

이렇게 쉽게 지정할 수 있다.

dp[i][j]는 위의 방법을 응용해서 dp[i-1][j] + dp[i][j-1] -dp[i-1][j-1] + arr[i][j]로 정의할 수 있다.

그렇다면 1번 사각형은 dp[x][y] - dp[x][j - 1] - dp[i - 1][y] + dp[i - 1][j - 1] 로 정의가 가능하다.



반응형