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

 

1937๋ฒˆ: ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

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

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

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

 

์ œํ•œ์‚ฌํ•ญ

  • ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ํฌ๊ธฐ n(1 โ‰ค n โ‰ค 500)
  • ๋Œ€๋‚˜๋ฌด์˜ ์–‘์€ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜

 

 

 

 

 

ํ’€์ด

  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ : DFS

 ๊ทธ๋ž˜ํ”„ ๋‚ด์—์„œ ์ƒํ•˜์ขŒ์šฐ์— ์ค‘ ํ•œ ๊ณณ์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ด๋™ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์ด๋™ํ•ด ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ DFS๋กœ ํƒ์ƒ‰์„ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

 ๋ชจ๋“  ์ง€์  ๋ณ„๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์นธ ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ๋งค๋ฒˆ ๋ชจ๋“  ์ง€์ ์— ๋Œ€ํ•ด DFS๋ฅผ ํ•œ๋‹ค๋ฉด ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ๋ฐœ์ƒํ•ด ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ค‘๋ณต์ ์ธ ํƒ์ƒ‰์„ ์ค„์ผ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

 

 

  • DP : ํ•ด๋‹น ์ง€์ ์„ ์‹œ์ž‘์œผ๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’ ์ €์žฅํ•˜๊ธฐ

 ๊ทธ๋ž˜ํ”„์™€ ๊ฐ™์€ 2์ฐจ์›์˜ DP ๋ฐฐ์—ด์— ํ•ด๋‹น ์ง€์ ์„ ์‹œ์ž‘์œผ๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•ด๋‘” ๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ ํƒ์ƒ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 DP ๋ฐฐ์—ด์˜ ์ดˆ๊ธฐ๊ฐ’์€ 0์œผ๋กœ, ๊ฐฑ์‹ ์ด ๋˜์—ˆ๋‹ค๋ฉด 0์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ visited ๋ฐฐ์—ด์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

 

 

 

์–ด๋–ค ์ง€์ (x, y)์˜ ์ตœ๋Œ“๊ฐ’์€ ๋‹ค์Œ ์ง€์ (nx, ny)์˜ + 1์ด ๋  ๊ฒƒ์ด๋‹ค.

dp[x][y] = dfs(nx, ny) + 1

 

 

ํ•˜์ง€๋งŒ, ๊ฒฝ๋กœ๋ณ„ ์ตœ๋Œ€๊ฐ’์ด ๋‹ค๋ฅด๋ฏ€๋กœ ํƒ์ƒ‰ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ง€์ ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

dp[x][y] = Math.max(dp[x][y], dfs(nx, ny) + 1)

 

 

 ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜„์žฌ 5์˜ ์œ„์น˜์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ ์ƒ๋‹จ์ธ 12์™€ ์™ผ์ชฝ์ธ 11์ด๋‹ค. ์ƒ๋‹จ์„ ๋จผ์ € ํƒ์ƒ‰ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ 5์˜ ์œ„์น˜์˜ DP ๊ฐ’์€ 1+1 = 2๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ์— ์™ผ์ชฝ์ธ 11์„ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด 2+1 = 3์œผ๋กœ, ๋จผ์ € ํƒ์ƒ‰ํ•œ 2๋ณด๋‹ค ๊ฐ’์ด ๋” ํฌ๋ฏ€๋กœ DP ๊ฐ’์€ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

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

public class BOJ_์š•์‹ฌ์Ÿ์ดํŒ๋‹ค {
	static int N;
	static int[][] graph;
	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());
		graph = new int[N][N];
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			
			for(int j = 0; j < N; j++) {
				graph[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		dp = new int[N][N];
		
		int max = 0;
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				max = Math.max(max, dfs(i, j));
			}
		}
		
		System.out.println(max);
	}

	public static int dfs(int x, int y) {
		if(dp[x][y] != 0) { //์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ์  ์žˆ์Œ
			return dp[x][y];
		}
		
		dp[x][y] = 1; //์ดˆ๊ธฐ๊ฐ’
		
		for(int d = 0; d < 4; d++) { //์‚ฌ๋ฐฉํƒ์ƒ‰
			int nx = x + dx[d];
			int ny = y + dy[d];
			
			if(nx < 0 || nx >= N || ny < 0 || ny >= N) continue; //๋ฒ”์œ„ ๋ฒ—์–ด๋‚จ
			
			if(graph[x][y] < graph[nx][ny]) {
				dp[x][y] = Math.max(dp[x][y], dfs(nx, ny) + 1); //ํƒ์ƒ‰ : ์ตœ๋Œ“๊ฐ’์ด ๋˜์–ด์•ผํ•จ
			}
		}
		
		return dp[x][y];
	}

}

 

 

 

 

 

 

๊ฒฐ๊ณผ

 

 

 

 

๋ฐฐ์šด์ 

giraffe_