https://www.acmicpc.net/problem/11660
๋ฌธ์
- N×N๊ฐ์ ์๊ฐ N×N ํฌ๊ธฐ์ ํ์ ์ฑ์์ ธ ์๋ค. (x1, y1)๋ถํฐ (x2, y2)๊น์ง ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ ์์ฑ
- ์ฒซ์งธ ์ค์ ํ์ ํฌ๊ธฐ N๊ณผ ํฉ์ ๊ตฌํด์ผ ํ๋ ํ์ M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000)
- N๊ฐ์ ์ค์๋ ํ์ ์ฑ์์ ธ ์๋ ์๊ฐ 1ํ๋ถํฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๋ค ๊ฐ์ ์ ์ x1, y1, x2, y2 ๊ฐ ์ฃผ์ด์ง๋ฉฐ, (x1, y1)๋ถํฐ (x2, y2)์ ํฉ์ ๊ตฌํด ์ถ๋ ฅํด์ผ ํ๋ค.
- ํ์ ์ฑ์์ ธ ์๋ ์๋ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. (x1 ≤ x2, y1 ≤ y2)
ํ์ด
ํ์ ํฌ๊ธฐ์ธ N์ ํฌ๊ธฐ๊ฐ ์ต๋ 1024, ์ฟผ๋ฆฌ์ ๊ฐ์์ธ M์ด ์ต๋ 100,000์ผ๋ก, ํฉ์ ๊ตฌํ๋ ๋ฐ, ์ต์ ์ ๊ฒฝ์ฐ์๋ N *N * M = 1024 * 1024 * 100,000 (์ฝ 10,000,000,000 = 100์ต)์ด ๊ฑธ๋ฆฐ๋ค!
๋งค๋ฒ ํฉ์ ๋์ ํด์ ๊ณ์ ๋ํ๋ ๊ฒ ๋ณด๋ค๋, ์ด์ ์ ํฉ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ ํ ์ด์ฉํ๋ฉด ํจ์จ์ ์ผ๋ก ํฉ์ ๊ตฌํ ์ ์๋ค. DP๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
[๋ฐฉ๋ฒ1] ํ ๋ณ๋ก ๋์ ํฉ ์ ์ฅํ๊ธฐ (1500ms ๋)
1๋ ์ ์ ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํ์๋ค. ํ ๋ณ๋ก ๋์ ํฉ์ ์ ์ฅํ๋ DP๋ฅผ ํ์ฉํ์ฌ 1500ms ๋์ ์๊ฐ์ผ๋ก ์ฑ๊ณต์ ํ๊ธด ํ์ง๋ง, 800ms ๋๊ฐ ๋์ค๋ ๋ค๋ฅธ ํ์ด๋ณด๋ค๋ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
1. dp[i][j]๋ก ํ ๋ณ ๋์ ํฉ ๊ตฌํ๊ธฐ
ํ ๋ณ๋ก dp[i][0]~ dp[i][M] ๊น์ง์ ๋์ ํฉ์ ๊ตฌํด๋๊ฐ๋ค.
2. (x1, y1)๋ถํฐ (x2, y2)์ ํฉ ๊ตฌํ๊ธฐ
x1๋ถํฐ x2๊น์ง dp[i][y2] - dp[i][y1] ์ ๊ฐ์ ๋ํด๋๊ฐ๋ฉด ๋๋ค.
DP๋ฅผ ์ฌ์ฉํด์ ํ ๋ณ ๋์ ํฉ์ ๊ตฌํ๋ ๊ฒ์ ์ต์ ํ๊ฐ ๋์์ง๋ง, ๋งค๋ฒ x1๋ถํฐ x2๊น์ง ํฉ์ ๊ณ์ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค..
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] dp = new int[N + 1][N + 1];
for(int i = 1; i < N + 1; i++) { //ํ๋ณ ๋์ ํฉ ์ ์ฅ
st = new StringTokenizer(br.readLine());
dp[i][1] = Integer.parseInt(st.nextToken());
for(int j = 2; j < N + 1; j++) {
dp[i][j] = dp[i][j - 1] + Integer.parseInt(st.nextToken());
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < M; i++) {
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 sum = 0;
for(int j = x1; j <= x2; j++) {
sum += dp[j][y2] - dp[j][y1 - 1];
}
sb.append(sum + "\n");
}
System.out.println(sb);
}
}
[๋ฐฉ๋ฒ2] ํ๋ ฌ ์ ์ฒด์ ๋์ ํฉ ์ ์ฅํ๊ธฐ (800ms ๋)
๋งค๋ฒ ํ ๋ณ๋ก ๊ฐ์ ๋ํ๋ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด์๋ ํ ๋ณ์ด ์๋๋ผ ํ๋ ฌ ์ ์ฒด์ ๋์ ํฉ์ ์ ์ฅํด์ผ ํ๋ค.
1. dp[i][j]๋ก (1, 1)~(i, j)์ ๋์ ํฉ ๊ตฌํ๊ธฐ
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j]
๋นจ๊ฐ์ ๋ถ๋ถ์ธ dp[i - 1][j]์ ํ๋์ ๋ถ๋ถ์ธ dp[i][j - 1]๋ฅผ ๋ํ๊ณ , ์ค๋ณตํด์ ๋ํ ๋ ธ๋์ ๋ถ๋ถ์ธ dp[i - 1][j - 1]์ ๋นผ์ฃผ๊ณ , ์์ ์ธ arr[i][j]์ ๋ํด์ค๋ค.
2. (x1, y1)๋ถํฐ (x2, y2)์ ํฉ ๊ตฌํ๊ธฐ
(x1, y1)๋ถํฐ (x2, y2)๋ฅผ ๊ตฌํ๋ ๋ฐ๋ (1, 1)~(i, j)๊น์ง์ ๋์ ํฉ์ธ dp[i][j]๋ฅผ ํ์ฉํ์ฌ ์ ์ ํ ์ฐ์ฐ์ ํ๋ฉด ๋๋ค.
๋ ธ๋์ ๋ถ๋ถ์ ๊ตฌํ๊ธฐ ์ํด์๋ ์ด๋ก์ ๋ถ๋ถ์ธ dp[x1 - 1][y2]๋ฅผ ๋นผ๊ณ , ํ๋์ ๋ถ๋ถ์ธ dp[x2][y1 - 1]์ ๋นผ์ฃผ๊ณ , ์ค๋ณตํด์ ๋บ ๋ถ๋ถ์ธ ํ์ ๋ถ๋ถ์ธ dp[x1 - 1][y1 - 1] ์ ๋ํด์ฃผ๋ฉด ๋๋ค.
์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] arr = new int[N + 1][N + 1];
for(int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 1; j <= N; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
int[][] dp = new int[N + 1][N + 1]; //ํ๋ ฌ (i, j)๊น์ง์ ํฉ
//ํ๋ ฌ (i, j)๊น์ง์ ํฉ ๊ตฌํ๊ธฐ
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];
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < M; i++) {
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 answer = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
sb.append(answer).append("\n");
}
System.out.println(sb);
}
}
๊ฒฐ๊ณผ
800ms๋ : ๋ฐฉ๋ฒ2
1500ms๋ : ๋ฐฉ๋ฒ1
๋ฐฐ์ด์
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1749๋ฒ : ์ ์๋ฐ๋จน๊ธฐ (0) | 2024.01.12 |
---|---|
๋ฐฑ์ค 14846๋ฒ : ์ง์ฌ๊ฐํ๊ณผ ์ฟผ๋ฆฌ (0) | 2024.01.12 |
๋ฐฑ์ค 20922๋ฒ : ๊ฒน์น๋ ๊ฑด ์ซ์ด (0) | 2024.01.09 |
๋ฐฑ์ค 1253๋ฒ : ์ข๋ค (0) | 2024.01.09 |
๋ฐฑ์ค 16234๋ฒ : ์ธ๊ตฌ ์ด๋ (0) | 2023.09.25 |