2 ๋ถ„ ์†Œ์š”

๐Ÿ“ [SW_1949] ๋“ฑ์‚ฐ๋กœ ์กฐ์„ฑ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution {
	static int dx[] = { 1, -1, 0, 0 };
	static int dy[] = { 0, 0, 1, -1 };
	static int[][] map;
	static boolean[][] v;
	static int N, K, res;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		// ํ…Œ์ผ€
		int TC = Integer.parseInt(br.readLine());

		for (int t = 1; t <= TC; t++) {
			sb.append("#").append(t).append(" ");

			st = new StringTokenizer(br.readLine(), " ");

			// N๊ฐœ์˜ ์ค„
			N = Integer.parseInt(st.nextToken());

			// ๊ณต์‚ฌ ๊ฐ€๋Šฅ ๊นŠ์ด K
			K = Integer.parseInt(st.nextToken());

			// ์ง€๋„ ์ •๋ณด
			map = new int[N][N];

			// ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
			v = new boolean[N][N];

			// ์ด ๋“ฑ์‚ฐ๋กœ ๊ธธ์ด
			res = 0;

			// ์ง€๋„ ์ž…๋ ฅ
			for (int i = 0; i < N; i++) {
				st = new StringTokenizer(br.readLine(), " ");
				for (int j = 0; j < N; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
				}
			}

			// ์™„์ „ ํƒ์ƒ‰
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					// ์ œ์ผ ๋†’์€ ๋ด‰์šฐ๋ฆฌ ์ฐพ๊ธฐ
					int highest = highest();
					for (int k = 0; k <= K; k++) {
						map[i][j] -= k;
						// ๊ธธ ์ฐพ๊ธฐ
						findRoad(highest);
						// ๋ฐฑํŠธ๋ž˜ํ‚น
						map[i][j] += k;
					}
				}
			}
			sb.append(res).append("\n");
		}
		System.out.println(sb);
	}

	// ๊ฐ€์žฅ ๋†’์€ ๋ด‰์šฐ๋ฆฌ ์ฐพ๊ธฐ
	static int highest() {
		int top = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				// ์ œ์ผ ๋†’์€ ๋ด‰์šฐ๋ฆฌ ๋†’์ด ์ฐพ๊ธฐ
				top = Math.max(top, map[i][j]);
			}
		}
		return top;
	}

	// ๊ธธ ์ฐพ๊ธฐ
	static void findRoad(int highest) {
		// ์ œ์ผ ๋†’์€ ๋ด‰์šฐ๋ฆฌ๋ถ€ํ„ฐ ์‹œ์ž‘
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				// ์ œ์ผ ๋†’์€ ๋ด‰์šฐ๋ฆฌ ์ผ๋•Œ
				if (map[i][j] == highest) {
					init();
					dfs(j, i, 1);
				}
			}
		}
	}

	// dfs 4๋ฐฉํ–ฅ ํƒ์ƒ‰
	static void dfs(int x, int y, int val) {
		// ์ตœ๋Œ€ ๋“ฑ์‚ฐ๋กœ
		res = Math.max(res, val);

		// 4๋ฐฉํ–ฅ ํƒ์ƒ‰
		int nx, ny;
		for (int i = 0; i < 4; i++) {
			nx = x + dx[i];
			ny = y + dy[i];

			// ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ
			if (nx < 0 || ny < 0 || nx >= N || ny >= N || v[ny][nx])
				continue;

			// ์ด๋™ ๊ฐ€๋Šฅ
			if (map[y][x] > map[ny][nx]) {

				// ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
				v[ny][nx] = true;

				// dfs ํ˜ธ์ถœ
				dfs(nx, ny, val + 1);

				// ๋ฐฑํŠธ๋ž˜ํ‚น
				v[ny][nx] = false;
			}
		}
	}

	// ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
	static void init() {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				v[i][j] = false;
			}
		}
	}
}

๐Ÿค” ๋‚˜์˜ ์ƒ๊ฐ

DFS + ์™„์ „ ํƒ์ƒ‰์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.
์ฒ˜์Œ์—” K๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ตญ N์˜ ํฌ๊ธฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํฌ์ง€ ์•Š๊ณ  ๋งŽ์€ ๊ฐ€์ง€์น˜๊ธฐ ์ž‘์—…์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ํ•ด๊ฒฐ์„ ํ•˜์˜€๋‹ค.
์™„์ „ ํƒ์ƒ‰ ๋ง๊ณ ๋„ ๊ฐ€์žฅ ๋†’์€ ๋ด‰์šฐ๋ฆฌ์—์„œ -1 ๋งŒ ํ•ด๊ฐ€๋ฉฐ ์ฒดํฌํ•˜๋Š” ํ’€์ด๋„ ์žˆ๋˜๋ฐ ๊ทธ๊ฒƒ์€ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ ค์„œ ํ•ด๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค.
๋‹ค์Œ์— ๋‹ค์‹œ ํ’€ ๊ธฐํšŒ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ด ๋ณด์•„์•ผ ๊ฒ ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ์ž๊พธ 51 test case ์ค‘์— 50๊ฐœ๋งŒ ๋งž์•„์„œ ๊ณ ์ƒ์„ ํ–ˆ๋Š”๋ฐ ์•ฝ๊ฐ„ ๋ฌธ์ œ์—์„œ ์•ˆ๋‚ด๊ฐ€ ์ข€ ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™๋‹ค..
๊ฐ€์žฅ ๋†’์€ ๋ด‰์šฐ๋ฆฌ์—์„œ ์‹œ์ž‘ํ•ด์„œ k์”ฉ ๋นผ๊ฐˆ ๋•Œ ๋ด‰์šฐ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋ฉด ์•ˆ๋œ๋‹คโ€ฆ ์ดˆ๊ธฐํ™” ํ•˜๋Š”๊ฒŒ ๋งž๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ โ€ฆใ…‹ใ…‹
์จŒ๋“  DFS ์™€ ์™„์ „ ํƒ์ƒ‰์„ ์ด์šฉํ•ด ํ’€์–ด๋‚ธ ๋ฌธ์ œ์ด๋‹ค.