๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Problem Solving

[Java] ๋ฐฑ์ค€ 1999 - ์ตœ๋Œ€์ตœ์†Œ

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

 

 

ํ’€์ด

N์˜ ํฌ๊ธฐ ์ œํ•œ์ด 250 ๋ฐ–์— ์•ˆ๋ผ์„œ O(N³ + KN)๊นŒ์ง€ ๊ฐ€๋Šฅ.

max[r][c] =A[r][c], A[r][c + 1], A[r][c + 2], …, A[r][c + B - 1] ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’

min[r][c] =A[r][c], A[r][c + 1], A[r][c + 2], …, A[r][c + B - 1] ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’

 

์œ„์˜ ๋‘ ๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜์„ ํ™œ์šฉํ•ด์„œ ๊ฐ ์งˆ๋ฌธ๋งˆ๋‹ค O(N²) ๊ฑธ๋ฆด ๋ถ€๋ถ„ํ–‰๋ ฌ ํƒ์ƒ‰์„ O(N)๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง.  

 

์ฝ”๋“œ

 

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class Main {
	public static final int MIN = -1;
	public static final int MAX = 251;

	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 B = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());

		int[][] A = new int[N + 1][N + 1];

		for (int r = 1; r <= N; r++) {
			st = new StringTokenizer(br.readLine());
			for (int c = 1; c <= N; c++) {
				A[r][c] = Integer.parseInt(st.nextToken());
			}
		}

		int[][] max = new int[N + 1][N + 1];
		int[][] min = new int[N + 1][N + 1];

		for (int r = 1; r <= N; r++) {
			for (int c = 1; c <= N - B + 1; c++) {
				int tempMax = MIN;
				int tempMin = MAX;

				for (int i = 0; i < B; i++) {
					if (A[r][c + i] >= tempMax) {
						tempMax = A[r][c + i];
					}

					if (A[r][c + i] <= tempMin) {
						tempMin = A[r][c + i];
					}
				}

				max[r][c] = tempMax;
				min[r][c] = tempMin;
			}
		}

		StringBuilder sb = new StringBuilder();

		while (K-- > 0) {
			st = new StringTokenizer(br.readLine());
			int r = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());

			int maxVal = MIN;
			int minVal = MAX;

			for (int i = 0; i < B; i++) {
				maxVal = Math.max(maxVal, max[r + i][c]);
				minVal = Math.min(minVal, min[r + i][c]);
			}

			sb.append(maxVal - minVal).append('\n');
		}

		System.out.println(sb);
		br.close();
	}
}

 

ํ›„๊ธฐ

์ฒ˜์Œ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜ ๊ณผ์ •์—์„œ ํˆฌ ํฌ์ธํ„ฐ ์จ์„œ ์ด ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(N²)๊นŒ์ง€ ์ค„์ด๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ฒ ๋‹ค ์‹ถ์—ˆ๋Š”๋ฐ, N์ด 250 ์ดํ•˜์ธ ๊ฑธ ๋ณด๊ณ  ๊ทธ๋ƒฅ ํŽธํ•˜๊ฒŒ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ ธ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค ํ’€์ด ๋ณด๋‹ˆ O(Nโด)๊นŒ์ง€ ํ†ต๊ณผ ๋œ๋‹ค๋Š” ๊ฒƒ ๊ฐ™๊ณ  (์ด๊ฑด ๋ฌธ์ œ์˜ ์˜๋„๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ธด ํ•œ๋ฐ..), ๊ทธ๋งŒํผ ํ’€์ด๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์˜€๋‹ค.