
-Code
import java.io.*;
import java.util.*;
public class BOJ11660 {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int size = Integer.parseInt(st.nextToken());
int testCase = Integer.parseInt(st.nextToken());
// 표 셋팅 (col을 누적합으로 계산)
int[][] graph = new int[size + 1][size + 1];
for (int row = 1; row <= size; row++) {
st = new StringTokenizer(br.readLine());
for (int col = 1; col <= size; col++) {
int input = Integer.parseInt(st.nextToken());
graph[row][col] = graph[row][col - 1] + input;
}
}
// row를 기준으로 다시 누적합 계산
for (int row = 1; row <= size; row++) {
for (int col = 1; col <= size ; col++) {
graph[row][col] += graph[row - 1][col];
}
}
// 계산
for (int t = 0; t < testCase; t++) {
st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
// 값을 구하려면 세로와 가로줄을 잘라내야함
int total = graph[x2][y2];
int cutRow = graph[x2][y1 - 1];
int cutCol = graph[x1 - 1][y2];
// 세로 가로를 잘라낸 후 겹치는 부분은 2번 빠지므로 더해줘야함
int overLap = graph[x1 - 1][y1 - 1];
System.out.println(total - cutRow - cutCol + overLap);
}
}
}
dp 구성을 잘해놓았으나 1차원 누적합으로 값을 구하는 문제처럼 (마지막 점 - 시작 점)으로 결과를 구했다가 다른 값이 나왔습니다. 그래서 왜 이런지 찾아보니 그렇게 구하는 게 아니라 전체 값에서 세로와 가로를 잘라내고 겹치는 부분을 다시 더해주는 공식이어서 공식을 알게 된 뒤 해결하게 되었습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 16306번 Cardboard Container (0) | 2026.01.12 |
|---|---|
| [프로그래머스/Java] 여행경로 (0) | 2026.01.11 |
| [백준/Java] 15990번 1, 2, 3 더하기 5 (0) | 2026.01.11 |
| [백준/Java] 1890번 점프 (0) | 2026.01.11 |
| [백준/Java] 24246번 Junior price robot (0) | 2026.01.11 |