Algorithm/๋ฐฑ์ค€

๋ฐฑ์ค€ 14846๋ฒˆ : ์ง์‚ฌ๊ฐํ˜•๊ณผ ์ฟผ๋ฆฌ

giraffe_ 2024. 1. 12. 17:34

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

 

14846๋ฒˆ: ์ง์‚ฌ๊ฐํ˜•๊ณผ ์ฟผ๋ฆฌ

์ฒซ์งธ ์ค„์— N (1 ≤ N ≤ 300)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ํ–‰๋ ฌ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ค„์€ N๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ํ–‰์€ ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ, ์—ด์€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ์œผ๋ฉฐ

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

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)๊นŒ์ง€์˜ ํ•ด๋‹น ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅ