<Algorithm> 204. 2차원 배열의 합(BJO)
by BFine반응형
1. 2차원 배열의 합(BJO)
사용 알고리즘 : 구간합
- 단순하게 N^3으로 풀수 있는 문제지만 알고리즘도 DP로 되어있기 때문에 DP로 풀어보았다.
- 1차원 배열에 대한 구간합은 쉽게 이해했었는데 2차원배열이 되니까 조금 헷갈리는 부분이 있었다.
- 이렇게 구간합을 사용하면 N^2 만으로 문제를 풀수가 있다.
문제에 대한 접근&생각
- 두 꼭지점에 대한 총합을 구해야함 -> 구간합!
- 예를 들어 위의 파랑색영역의 합 -> 핑크색영역에서 갈색영역을 뺀다 -> 빨간색영역이 남는다 -> 여기에 노란색 영역을 뺀다
- 결과적으로 파란영역 - 회색영역이 남기 떄문에 두번빼준 회색영역을 한번 더하면 파란영역의 크기를 구할수있음
- 갈색영역 -> 오른쪽 V의 x좌표, 왼쪽V의 y좌표-1 , 노란색영역 -> 왼쪽V의 x-1좌표, 오른쪽 V의 y좌표, 회색영역, 왼쪽V -1씩한 좌표
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), m = sc.nextInt();
int[][] arr = new int[n+1][m+1];
/******************************
* 2차원 배열의 부분합을 구하여
* 원하는 직사각형에 대한 넓이를 구한다.
*******************************/
for(int i = 1; i < n+1; i++)
for(int j = 1; j < m+1; j++)
arr[i][j] = sc.nextInt();
for(int i = 1; i < n+1; i++)
for(int j = 2; j < m+1; j++)
arr[i][j] += arr[i][j-1];
for(int i = 1; i < m+1; i++)
for(int j = 2; j < n+1; j++)
arr[j][i] += arr[j-1][i];
int q = sc.nextInt();
while(q-->0) {
int i = sc.nextInt(), j = sc.nextInt(),x = sc.nextInt(),y = sc.nextInt();
System.out.println(arr[x][y]- arr[x][j-1]-arr[i-1][y]+arr[i-1][j-1]);
}
}
}
|
|
cs |
참고 & 출처
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 206. 보행자천국(Programmers) (0) | 2019.05.27 |
---|---|
<Algorithm> 205. 캠핑(Programmers) (0) | 2019.05.25 |
<Algorithm> 203. 탑(BJO) (0) | 2019.05.21 |
<Algorithm> 202. 하노이 탑 이동순서(BJO) (0) | 2019.05.20 |
<Algorithm> 201. 게임맵최단거리(Programmers) (0) | 2019.05.18 |
블로그의 정보
57개월 BackEnd
BFine