[BOJ] 1937 ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

Baekjoon Online Judge - 1937๋ฒˆ ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

n ร— n์˜ ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์žˆ๋‹ค. ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค๋Š” ์–ด๋–ค ์ง€์—ญ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณณ์˜ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋‹ค ๋จน์–ด ์น˜์šฐ๋ฉด ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ค‘ ํ•œ ๊ณณ์œผ๋กœ ์ด๋™์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๊ทธ๊ณณ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹จ ์กฐ๊ฑด์ด ์žˆ๋‹ค. ์ด ํŒ๋‹ค๋Š” ๋งค์šฐ ์š•์‹ฌ์ด ๋งŽ์•„์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ณ  ์ž๋ฆฌ๋ฅผ ์˜ฎ๊ธฐ๋ฉด ๊ทธ ์˜ฎ๊ธด ์ง€์—ญ์— ๊ทธ ์ „ ์ง€์—ญ๋ณด๋‹ค ๋Œ€๋‚˜๋ฌด๊ฐ€ ๋งŽ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ด ํŒ๋‹ค์˜ ์‚ฌ์œก์‚ฌ๋Š” ์ด๋Ÿฐ ํŒ๋‹ค๋ฅผ ๋Œ€๋‚˜๋ฌด ์ˆฒ์— ํ’€์–ด ๋†“์•„์•ผ ํ•˜๋Š”๋ฐ, ์–ด๋–ค ์ง€์ ์— ์ฒ˜์Œ์— ํ’€์–ด ๋†“์•„์•ผ ํ•˜๊ณ , ์–ด๋–ค ๊ณณ์œผ๋กœ ์ด๋™์„ ์‹œ์ผœ์•ผ ํŒ๋‹ค๊ฐ€ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์นธ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ฏผ์— ๋น ์ ธ ์žˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ž„๋ฌด๋Š” ์ด ์‚ฌ์œก์‚ฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. n ร— n ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์ฃผ์–ด์ ธ ์žˆ์„ ๋•Œ, ์ด ํŒ๋‹ค๊ฐ€ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์นธ์„ ์ด๋™ํ•˜๋ ค๋ฉด ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•˜์—ฌ ์›€์ง์—ฌ์•ผ ํ•˜๋Š”์ง€ ๊ตฌํ•˜์—ฌ

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ํฌ๊ธฐ n(1 โ‰ค n โ‰ค 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ์ •๋ณด๋Š” ๊ณต๋ฐฑ์„ ์‚ฌ์ด๋กœ ๋‘๊ณ  ๊ฐ ์ง€์—ญ์˜ ๋Œ€๋‚˜๋ฌด์˜ ์–‘์ด ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋Œ€๋‚˜๋ฌด์˜ ์–‘์€ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ํŒ๋‹ค๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์˜ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

ํ•ด์„ค

DP, DFS, ์žฌ๊ท€, Top-Down

nxn ๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•ด DP ๊ฐ’์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฉด ํƒ์ƒ‰์„ ์‹œ๋„ํ•œ๋‹ค. ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ค‘ ์ž์‹ ๋ณด๋‹ค ๋Œ€๋‚˜๋ฌด ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ ์ขŒํ‘œ๋Š” ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ์ ‘ ์ขŒํ‘œ ์ค‘ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ ์ขŒํ‘œ์ผ ๋•Œ ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ์ธ์ ‘ ์ขŒํ‘œ์— ์ €์žฅ๋œ dp๊ฐ’์„ ๊ตฌํ•˜๊ณ , (์ธ์ ‘ ์ขŒํ‘œ dp๊ฐ’ + 1) ํ•œ ๊ฐ’์ด ์ž์‹ ์˜ dp ๊ฐ’์ด ๋œ๋‹ค.(ํ•ด๋‹น ์ธ์ ‘์ขŒํ‘œ๊นŒ์ง€ ๊นŠ์ด์— ์ž๊ธฐ ์ž์‹ ์„ ๋”ํ•จ)

์žฌ๊ท€์ ์œผ๋กœ ๋”์ด์ƒ ํƒ€๊ณ  ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(๊ธฐ์ €์กฐ๊ฑด)๋Š” ์ž๊ธฐ ์ž์‹ ์ด ์ธ์ ‘ํ•œ 4๋ฐฉ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋Œ€๋‚˜๋ฌด ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์„ ๋•Œ์ด๊ณ , ์ด๋•Œ๋Š” dp ๊ฐ’์„ 1๋กœ ์„ค์ •ํ•œ๋‹ค.

์ฝ”๋“œ

Java
import java.io.*;
import java.util.*;

public class BOJ_1937_์š•์‹ฌ์Ÿ์ดํŒ๋‹ค {
	static int n, maxBamboo;
	static int[][] map;
	static int[][] dp;
	static int[] dx = {-1, 1, 0, 0};
	static int[] dy = {0, 0, -1, 1};
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		
		// ์ดˆ๊ธฐ ์ง€๋„ ์„ค์ • ๋ฐ DP ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
		map = new int[n][n];
		dp = new int[n][n];
		for (int i=0; i<n; i++) {
			Arrays.fill(dp[i], -1);     // ๋ฐฉ๋ฌธ์—ฌ๋ถ€ ์ฒดํฌ๋ฅผ ์œ„ํ•ด -1๋กœ ์ดˆ๊ธฐํ™”
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j=0; j<n; j++) map[i][j] = Integer.parseInt(st.nextToken());
		}
		// DP ํ…Œ์ด๋ธ” ๋งŒ๋“ค๋ฉฐ ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ณ  ์ถœ๋ ฅ
		makeDPTable();
		System.out.println(maxBamboo);
	}

	// ๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•ด DP ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ
	private static void makeDPTable() {
		for (int i=0; i<n; i++) {
			for (int j=0; j<n; j++) {
				// ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•„ DP ํ…Œ์ด๋ธ”์ด ๋นˆ ๊ฒฝ์šฐ๋งŒ DP ํ…Œ์ด๋ธ”์„ ์ฑ„์›€
				if (dp[i][j]==-1) {
					countBamboo(i, j);
					maxBamboo = Math.max(maxBamboo, dp[i][j]);    // ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
				}
			}
		}
	}

	// ํ˜„์žฌ ์ขŒํ‘œ์˜ DP ๊ฐ’ ๊ตฌํ•˜๊ธฐ
	private static int countBamboo(int i, int j) {
		// ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ์–ด DP ํ…Œ์ด๋ธ”์ด ์ฑ„์›Œ์ ธ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฐ’ + 1์„ ๋ฐ˜ํ™˜
		if (dp[i][j]!=-1) return dp[i][j] + 1;
		
		// ๋ฐฉ๋ฌธํ•œ ์  ์—†์œผ๋ฉด 4๋ฐฉ ํƒ์ƒ‰์œผ๋กœ DP ํ…Œ์ด๋ธ” ์ฑ„์›€
		dp[i][j] = 0;
		for (int d=0; d<4; d++) {
			int nx = i + dx[d];
			int ny = j + dy[d];
			// ๊ฒฝ๊ณ„ ๋‚ด๋ถ€์ด๊ณ  ์ž์‹ ๋ณด๋‹ค ์ ์€ ๊ฐœ์ˆ˜์˜ ๋Œ€๋‚˜๋ฌด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ํƒ์ƒ‰
			if (isInside(nx, ny) && map[nx][ny]<map[i][j]) dp[i][j] = Math.max(dp[i][j], countBamboo(nx, ny));
		}
		// 4๋ฐฉ ํƒ์ƒ‰ ์ดํ›„์—๋„ DP ํ…Œ์ด๋ธ”์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š์€ ์ƒํƒœ, ์ฆ‰ 4๋ฐฉ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ž๊ธฐ ์ž์‹ ์˜ ๋Œ€๋‚˜๋ฌด๊ฐ€ ๊ฐ€์žฅ ์ ์œผ๋ฉด 1์นธ(์ž๊ธฐ์ž์‹ )์œผ๋กœ ์„ค์ •
		if (dp[i][j]==0) dp[i][j] = 1;
		
		return dp[i][j] + 1;    // ์ธ์ ‘ํ•œ ์ขŒํ‘œ๊นŒ์ง€์˜ DP ๊ฐ’ + 1(์ž๊ธฐ์ž์‹ ) ๋ฐ˜ํ™˜
	}
	
	// ๊ฒฝ๊ณ„์ฒดํฌ
	private static boolean isInside(int x, int y) {
		return (x>=0 && x<n && y>=0 && y<n);
	}

}