[Boj_2167] 2์ฐจ์ ๋ฐฐ์ด์ ํฉ
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2167
2167๋ฒ: 2์ฐจ์ ๋ฐฐ์ด์ ํฉ
์ฒซ์งธ ์ค์ ๋ฐฐ์ด์ ํฌ๊ธฐ N, M(1 ≤ N, M ≤ 300)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์ ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค. ๋ฐฐ์ด์ ํฌํจ๋์ด ์๋ ์๋ ์ ๋๊ฐ์ด 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ๊ทธ ๋ค์ ์ค์๋
www.acmicpc.net
โธ ๋ฌธ์
2์ฐจ์ ๋ฐฐ์ด์ด ์ฃผ์ด์ก์ ๋ (i, j) ์์น๋ถํฐ (x, y) ์์น๊น์ง์ ์ ์ฅ๋์ด ์๋ ์๋ค์ ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ฐฐ์ด์ (i, j) ์์น๋ iํ j์ด์ ๋ํ๋ธ๋ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฐฐ์ด์ ํฌ๊ธฐ N, M(1 ≤ N, M ≤ 300)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ M๊ฐ์ ์ ์๋ก ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ค. ๋ฐฐ์ด์ ํฌํจ๋์ด ์๋ ์๋ ์ ๋๊ฐ์ด 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ๊ทธ ๋ค์ ์ค์๋ ํฉ์ ๊ตฌํ ๋ถ๋ถ์ ๊ฐ์ K(1 ≤ K ≤ 10,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ K๊ฐ์ ์ค์๋ ๋ค ๊ฐ์ ์ ์๋ก i, j, x, y๊ฐ ์ฃผ์ด์ง๋ค(1 ≤ i ≤ x ≤ N, 1 ≤ j ≤ y ≤ M).
โธ ์ถ๋ ฅ
K๊ฐ์ ์ค์ ์์๋๋ก ๋ฐฐ์ด์ ํฉ์ ์ถ๋ ฅํ๋ค. ๋ฐฐ์ด์ ํฉ์ 231-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ์ค๋ฒ 5
- ๐ ๋ฌธ์ ์ ํ : ๊ตฌํ, ๋์ ํฉ
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
- ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง 2์ฐจ์ ๋ฐฐ์ด์ ๋ํ ๋์ ํฉ์ ์ ์ฅํ ๋ฐฐ์ด์ ์์ฑํ ๋ค, ๋ฐฐ์ด์ ๋์ ํฉ์ ๊ณ์ฐํ์ฌ ์ ์ฅํ๋ค.
- prefix[i][j] = map[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];
- (i, j) ์์น๋ถํฐ (x, y) ์์น๊น์ง์ ๋์ ํฉ์ ๊ตฌํ๊ธฐ ์ํด ์ ํ์์ ์ฐพ์ ํด๊ฒฐํ๋ค.
- ์ ํ์ : prefix[x][y] - prefix[i-1][y] - prefix[x][j-1] + prefix[i-1][j-1];
- ํฉ์งํฉ = ์ ์ฒด ๋์ ํฉ - ์ผ์ชฝ ๋์ ํฉ - ์์ชฝ ๋์ ํฉ + ๊ต์งํฉ ๋์ ํฉ
๐ ๋์ ํฉ์ด๋ ?
- ๋ฐฐ์ด์ ์ผ๋ถ ๊ตฌ๊ฐ์ ๋ํ ํฉ์ ๋น ๋ฅด๊ฒ ๊ตฌํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฐ์ด์ ๊ฐ๋ค์ด ๋ณํ์ง ์๋๋ค๋ฉด ๋์ ๋ ํฉ ๋ํ ๋ณ๋์ด ์๋ค๋ ์ ์ ์ ์ฉํ๋ค.
- ๋ฏธ๋ฆฌ ๊ตฌํด๋ ๋์ ํฉ์ ํตํด ๋ฐฐ์ด ์ค ํน์ ๊ตฌ๊ฐ์ ๋ถ๋ถํฉ์ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
- ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์ฅํด ๋๋ ์ ์ด DP์ ์ ์ฌํ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 26240 KB
์๊ฐ : 276 ms
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
// ๋ฐฐ์ด์ ํฌ๊ธฐ
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] map = new int[n+1][m+1];
int[][] prefix = new int[n+1][m+1]; // ๋์ ํฉ์ ์ ์ฅํ ๋ฐฐ์ด
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= m; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
// ๋ฐฐ์ด์ ๋์ ํฉ ์ ์ฅํ๊ธฐ
prefix[i][j] = map[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];
}
}
int k = Integer.parseInt(br.readLine()); // ํฉ์ ๊ตฌํ ๋ถ๋ถ์ ๊ฐ์
while (k --> 0) {
st = new StringTokenizer(br.readLine());
// (i, j) ์์น๋ถํฐ (x, y) ์์น
int i = Integer.parseInt(st.nextToken());
int j = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
// ans : (i, j) ์์น๋ถํฐ (x, y) ์์น๊น์ง์ ํฉ
// ์ ํ์ : ์ ์ฒด ๋์ ํฉ - ์ผ์ชฝ ๋์ ํฉ - ์์ชฝ ๋์ ํฉ + ๊ต์งํฉ ๋์ ํฉ
int ans = prefix[x][y] - prefix[i-1][y] - prefix[x][j-1] + prefix[i-1][j-1];
bw.append(ans + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
๐ ํจ๊ป ํ์ด๋ณด๋ฉด ์ข์ ๋ฐฑ์ค ๋ฌธ์