https://www.acmicpc.net/problem/14846
๋ฌธ์
Nํ N์ด๋ก ์ด๋ฃจ์ด์ง ์ ์ฌ๊ฐํ ํ๋ ฌ A๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋, ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
- x1 y1 x2 y2: ์ผ์ชฝ ์์นธ์ด (x1, y1)์ด๊ณ , ์ค๋ฅธ์ชฝ ์๋ซ์นธ์ด (x2, y2)์ธ ๋ถ๋ถ ํ๋ ฌ์ ํฌํจ๋์ด ์๋ ์๋ก ๋ค๋ฅธ ์ ์์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ํ์ฌํญ
์ฒซ์งธ ์ค์ N (1 ≤ N ≤ 300)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ํ๋ ฌ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ค์ N๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ํ์ ์์์๋ถํฐ ์๋๋ก, ์ด์ ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์์ผ๋ฉฐ, ๋ฒํธ๋ 1๋ฒ๋ถํฐ ์์ํ๋ค. ํ๋ ฌ์ด ํฌํจํ๊ณ ์๋ ์ ์๋ 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
๋ค์ ์ค์๋ Q (1 ≤ Q ≤ 100,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ Q๊ฐ์ ์ค์๋ ์ฟผ๋ฆฌ์ ์ ๋ณด x1, y1, x2, y2๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ x1 ≤ x2 ≤ n, 1 ≤ y1 ≤ y2 ≤ n)
ํ์ด
(x1, y1)~(x2, y2)์ธ ๋ถ๋ถ ํ๋ ฌ์์ ์๋ก ๋ค๋ฅธ ์ ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก, (x1, y1)~(x2, y2)์ธ ๋ถ๋ถ ํ๋ ฌ์์ ๋์ ํฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ ๋น์ทํ๋ค.
๋ฐฑ์ค 11660๋ฒ ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ5 : https://www.acmicpc.net/problem/11660)
(ํ์ด) ๋ฐฑ์ค 11660๋ฒ ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ5 : https://programmingiraffe.tistory.com/160
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
์ฒ์ ์๊ฐํ ์ ์๋ ํ์ด๋ (x1, y1)~(x2, y2)๊น์ง ๋ชจ๋ ํ์ํ๋ฉฐ, ๊ฐ ์ ์๊ฐ ๋ช ๊ฐ ๋์๋์ง ์ธ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฌธ์ ์ ์ ๋ ฅ์ ์ดํด๋ณด๋ฉด, ํ๋ ฌ ํฌ๊ธฐ์ธ N์ด ์ต๋ 300, ์ฟผ๋ฆฌ์ ๊ฐ์์ธ Q๊ฐ ์ต๋ 100,000์ผ๋ก ๋งค๋ฒ ๋ถ๋ถ ํ๋ ฌ์ ๋ชจ๋ ํ์ํ๋ค๋ฉด, ์ต์ ์ ๊ฒฝ์ฐ O(N^2 * Q) = 300 * 300 * 100,000๋ ์ฝ 90์ต์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
๋ฐ๋ผ์ ์ฐ์ฐ์ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด, ์์ ๊ฐ ์ ์๊ฐ ๋ช ๊ฐ ๋์๋์ง๋ฅผ ํ์ฉํ์ฌ ํ์ฌ๊น์ง์ ๊ฐ ์ ์์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์๋ DP๋ฅผ ํ์ฉํด์ผ ํ๋ค.
- (1, 1)~(i, j)๊น์ง์ ๊ฐ ์ ์ ๊ฐ์ ๊ตฌํ๊ธฐ
(i, j)๊น์ง์ ๊ฐ ์ ์ ๊ฐ์๋ฅผ ์ ์ฅํ DP ๋ฐฐ์ด์ 3์ฐจ์์ผ๋ก ์ ์ธํด์ค๋ค.
int[][][] dp = new int[11][N + 1][N + 1];
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ขํ๋ฅผ ์ํํ๊ณ , 1~10 ๋ชจ๋ ์ซ์์ ๋ํด (i, j)๊น์ง์ ํด๋น ์ซ์์ ๊ฐ์๋ฅผ DP๋ก ๊ณ์ฐ์ ํ๋ค.
์ด๋ค ์ซ์ num์ (i, j)๊น์ง์ ๊ฐ์๋ ๋นจ๊ฐ์ ๋ถ๋ถ์ธ dp[num][i - 1][j]์ ํ๋์ ๋ถ๋ถ์ธ dp[num][i][j - 1]๋ฅผ ๋ํ๊ณ , ์ค๋ณตํด์ ๋ํ ๋ ธ๋์ ๋ถ๋ถ์ธ dp[num][i - 1][j - 1]์ ๋นผ์ค ๊ฒ์ด๋ค. ๋ง์ฝ arr[i][j]์ ๊ฐ์ด ์ด๋ค ์ซ์์ธ num๊ณผ ๊ฐ๋ค๋ฉด +1์ ํด์ฃผ๋ฉด ๋๋ค.
- (x1, y1)๋ถํฐ (x2, y2)๊น์ง์ ๊ฐ ์์์ ๊ฐ์ ๊ตฌํ๊ธฐ
(x1, y1)~(x2, y2)์ ์ด๋ค ์ ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฐ๋ (1, 1)~(i, j)๊น์ง์ ์ด๋ค ์ ์์ ๊ฐ์์ธ dp[num][i][j]๋ฅผ ํ์ฉํ์ฌ ์ ์ ํ ์ฐ์ฐ์ ํ๋ฉด ๋๋ค.
๋ ธ๋์ ๋ถ๋ถ์ ๊ตฌํ๊ธฐ ์ํด์๋ ์ด๋ก์ ๋ถ๋ถ์ธ dp[num][x1 - 1][y2]๋ฅผ ๋นผ๊ณ , ํ๋์ ๋ถ๋ถ์ธ dp[num][x2][y1 - 1]์ ๋นผ์ฃผ๊ณ , ์ค๋ณตํด์ ๋บ ๋ถ๋ถ์ธ ํ์ ๋ถ๋ถ์ธ dp[num][x1 - 1][y1 - 1] ์ ๋ํด์ฃผ๋ฉด ๋๋ค.
- 1~10์ dp[num][i][j] ํ์ธํ๊ธฐ
๋ฌธ์ ์์ ์ ์๋ ์ ์์ ๋ฒ์์ธ 1~10์ DP๋ฅผ ๋ชจ๋ ํ์ธํ๋ฉฐ, 0์ด์์ด๋ผ๋ฉด ํด๋น ์ซ์๊ฐ ์์ผ๋ฏ๋ก ์ ๋ต์ ๊ฐ์๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ๋ฉด ๋๋ค.
์ฝ๋
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));
int N = Integer.parseInt(br.readLine()); //ํ๋ ฌ ํฌ๊ธฐ
int[][] A = new int[N + 1][N + 1]; //ํ๋ ฌ
for(int i = 1; i <= N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int j = 1; j <= N; j++) {
A[i][j] = Integer.parseInt(st.nextToken());
}
}
int[][][] dp = new int[11][N + 1][N + 1]; //ํ๋ ฌ (i, j)๊น์ง์ ํด๋น ๋ฒํธ์ ๊ฐ์
//ํ๋ ฌ (i, j)๊น์ง์ ๊ฐ ๋ฒํธ๋ณ ๊ฐ์ ๊ตฌํ๊ธฐ
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
for(int k = 1; k <= 10; k++) {
dp[k][i][j] = dp[k][i - 1][j] + dp[k][i][j - 1] - dp[k][i - 1][j - 1];
}
dp[A[i][j]][i][j]++;
}
}
int Q = Integer.parseInt(br.readLine()); //์ฟผ๋ฆฌ ์
StringBuilder sb = new StringBuilder();
for(int i = 0; i < Q; i++) {
StringTokenizer 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 = 0;
for(int num = 1; num <= 10; num++) {
int count = dp[num][x2][y2] - dp[num][x1 - 1][y2] - dp[num][x2][y1 - 1] + dp[num][x1 - 1][y1 - 1];
if(count > 0) answer++;
}
sb.append(answer).append("\n");
}
System.out.println(sb);
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์
- 3์ฐจ์ DP ๋ฐฐ์ด๋ก (i, j)๊น์ง์ ํด๋น ์ซ์์ ๊ฐ์๋ฅผ ์ ์ฅ
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 20440๋ฒ : ๐ต๋๊ฐ ์ซ์ด ์ซ์ด ๋๋ฌด ์ซ์ด ์ซ์ด ์ค์ง ๋ง ๋ด๊ฒ ์ฐ์ฉ๋์ง๋ง๐ต - 1 (0) | 2024.01.13 |
---|---|
๋ฐฑ์ค 1749๋ฒ : ์ ์๋ฐ๋จน๊ธฐ (0) | 2024.01.12 |
๋ฐฑ์ค 11660๋ฒ : ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ5 (0) | 2024.01.12 |
๋ฐฑ์ค 20922๋ฒ : ๊ฒน์น๋ ๊ฑด ์ซ์ด (0) | 2024.01.09 |
๋ฐฑ์ค 1253๋ฒ : ์ข๋ค (0) | 2024.01.09 |