백준 11660 - 구간 합 구하기 5
Updated:
Java
11660 번 - 구간 합 구하기 5
문제
접근 방법
2차원 배열 누적합을 계산하였다.
현재 위치가 (y,x)라고 할 때, 시작 부터 (y,x)까지 누적합은 현재 위치를 기준으로 [누적합 [위쪽 값 + 왼쪽 값 - 왼쪽,위쪽 값] + 현재 위치 값] 이다.
이후 y1,x1, y2,x2의 범위의 누적합은 [(y2,x2) - (y1 - 1, x2) - (y2, x1 - 1) + (y1 - 1, x1 - 1)] 이다.
이번에 얻은 팁
처음 해결하였을 때는 현재 위치에서 -1을 할 때 배열 범위를 벗어나는지 확인하여야 했지만, 시작점을 1,1부터 두면 0번째 행,열은 자동으로 0으로 계산되어서 편하다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, m, result;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("res/mainInput.txt")); //제출 할 때 주석해야함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = stoi(stk.nextToken());
m = stoi(stk.nextToken());
int[][] arr = new int[n + 1][n + 1];
int[][] dp = new int[n + 1][n + 1]; // 행열 기준 4각형 누적 합
for(int i = 1; i <= n; i++) {
stk = new StringTokenizer(br.readLine());
for(int j = 1; j <= n; j++) {
arr[i][j] = stoi(stk.nextToken());
}
}
// 누적 합 구하기
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j];
}
}
// 범위의 값 구하기
while(m-- != 0) {
int y1, x1, y2, x2;
stk = new StringTokenizer(br.readLine());
y1 = stoi(stk.nextToken());
x1 = stoi(stk.nextToken());
y2 = stoi(stk.nextToken());
x2 = stoi(stk.nextToken());
result = dp[y2][x2] - dp[y1 - 1][x2] - dp[y2][x1 - 1] + dp[y1 - 1][x1 - 1];
System.out.println(result);
}
br.close();
}
static int stoi(String str) {
return Integer.parseInt(str);
}
}