Algorithm/DP

BOJ#2167 2차원 배열의 합

밤이2209 2017. 5. 10. 16:14

BOJ#2167 2차원 배열의 합


* 문제

https://www.acmicpc.net/problem/2167



* 풀이

단순하게 for loop 2개로 (i, j) ~ (x, y) 원소들을 더해도 되지만

계산량을 줄이기 위해서 아래와 같이 구현해보았습니다.


1. 입력을 받으면서 dp[row][col]를 계산해 놓는다.

dp[row][col] : (row, 1) 부터 (row, col)까지의 합 


2. K개의 쿼리를 입력 받는다. (i, j), (x, y)


3. 행 단위로 합을 구하고 sum 변수에 합산한다.


for ( row = i ... x) {


  sum += dp[row][y] - dp[row][j - 1];

}




* 나의 코드



import java.io.*;
import java.util.StringTokenizer;

/**
* BOJ#2167 2차원 배열의 합
* https://www.acmicpc.net/problem/2167
*/

public class Main {

static int[][] arr = new int[301][301];
static int[][] dp = new int[301][301];

public static void main(String[] args) throws IOException {

int N, M; // 배열의 크기
int K; // query

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

for (int i = 1; i <= N; i++) {

st = new StringTokenizer(br.readLine());
for (int j = 1; j <= M; j++) {

arr[i][j] = Integer.parseInt(st.nextToken());
dp[i][j] = arr[i][j] + dp[i][j - 1];
}
}

K = Integer.parseInt(br.readLine());

for (int k = 0; k < K; k++) {

int i, j, x, y;

st = new StringTokenizer(br.readLine());

i = Integer.parseInt(st.nextToken());
j = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());

int sum = 0;
for (int row = i; row <= x; row++) {

sum += dp[row][y] - dp[row][j-1];
}

bw.write(sum + "\n");
} // ~ K loop

bw.flush();
bw.close();
br.close();
} // ~ main
}


'Algorithm > DP' 카테고리의 다른 글

BOJ#5015 ls  (0) 2017.08.07
BOJ#1234 크리스마스 트리  (0) 2017.07.12
BOJ#1010 다리 놓기  (0) 2017.05.09
BOJ#9084 동전  (0) 2017.05.01
BOJ#14501 퇴사  (0) 2017.04.22