Algorithm/BOJ

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

jeong_ii 2025. 3. 4. 16:39

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

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

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

 

โ–ธ ์ž…๋ ฅ

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

 

โ–ธ ์ถœ๋ ฅ

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

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” DFS ๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, DP์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

DP๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ ํƒ์ƒ‰ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ๋•Œ ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต ํƒ์ƒ‰์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

dp[i][j]๋ฅผ ์ขŒํ‘œ (i, j)์—์„œ ์ถœ๋ฐœํ–ˆ์„ ๋•Œ ํŒ๋‹ค๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์นธ ์ˆ˜๋ผ๊ณ  ๋ณธ๋‹ค.

์ฆ‰,  dp[i][j] = k๋ผ๋ฉด, ํŒ๋‹ค๊ฐ€ (i, j)์—์„œ ์ถœ๋ฐœํ–ˆ์„ ๋•Œ, ์ตœ๋Œ€ k ์นธ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

์ด๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด, DFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  dp[i][j]์— ์ €์žฅํ•œ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์€ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

2 3
1 4

 

ํŒ๋‹ค๊ฐ€ (0, 0)์—์„œ ์ถœ๋ฐœํ•œ๋‹ค๋ฉด, ํŒ๋‹ค๋Š” 2 → 3 → 4 ์ˆœ์„œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ ์ด๋™ ๊ฑฐ๋ฆฌ๋Š” 3์ด๋ฉฐ,  dp[0][0] = 3์ด ๋œ๋‹ค.

 

ํŒ๋‹ค๊ฐ€ (1, 0)์—์„œ ์ถœ๋ฐœํ•œ๋‹ค๋ฉด, ํŒ๋‹ค๋Š” 1   → 3 → 4 ์ˆœ์„œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

1   2๋กœ ์ด๋™ํ•œ ํ›„, dp[0][0] = 3์ด ์ด๋ฏธ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ dp[1][0] = dp[0][0] + 1 = 4๊ฐ€ ๋œ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 40580KB
์‹œ๊ฐ„ : 380ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int n;
    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()); // ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ํฌ๊ธฐ
        map = new int[n][n];
        StringTokenizer st;
        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());
            }
        }

        dp = new int[n][n];
        int ans = 0; // ํŒ๋‹ค๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์˜ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                ans = Math.max(ans, dfs(i, j));
            }
        }

        System.out.println(ans);
    }

    private static int dfs(int x, int y) {
        if (dp[x][y] != 0) { // ์ด๋ฏธ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Œ
            return dp[x][y];
        }

        // ํŒ๋‹ค๋Š” ์ตœ์†Œ ํ•œ ๊ตฐ๋ฐ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน์„ ์ˆ˜ ์žˆ์Œ
        dp[x][y] = 1;

        for (int i = 0; i < 4; i++) {
            int nx = dx[i] + x;
            int ny = dy[i] + y;

            // ๋ฒ”์œ„ ์ฒดํฌ
            if (rangeCheck(nx, ny)) continue;

            // ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ณ  ์ž๋ฆฌ๋ฅผ ์˜ฎ๊ธฐ๋ฉด 
            // ๊ทธ ์˜ฎ๊ธด ์ง€์—ญ์— ๊ทธ ์ „ ์ง€์—ญ๋ณด๋‹ค ๋Œ€๋‚˜๋ฌด๊ฐ€ ๋งŽ์ด ์žˆ์–ด์•ผ ํ•จ
            if (map[x][y] < map[nx][ny]) {
                // ์ƒํ•˜์ขŒ์šฐ ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ๋จน์„ ์ˆ˜ ์žˆ์€ ๊ฒฝ๋กœ ํƒ์ƒ‰
                dp[x][y] = Math.max(dp[x][y], dfs(nx, ny)+1);
            }
        }

        return dp[x][y];
    }

    private static boolean rangeCheck(int x, int y) {
        return x < 0 || x >= n || y < 0 || y >= n;
    }
}

 

์ฒ˜์Œ์—๋Š” DFS ๋Œ๋ฆฌ๋ฉด์„œ ๋‹ค ๊ฒ€์‚ฌํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๋ฅผ ๋ณด๋‹ˆ DP๊ฐ€ ์žˆ์–ด, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด ํ•ด๊ฒฐํ–ˆ๋‹ค. DP๋Š” ํ’€๊ธฐ๋„ ์‹ซ๊ณ ,, ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค,,

๊ทธ๋ž˜๋„ ์˜ค๋žœ๋งŒ์— ์žฌ๋ฐŒ๋Š” ๋ฌธ์ œ๋ฅผ ํ‘ผ ๊ฒƒ ๊ฐ™์•„ ํฌ์ŠคํŒ…ํ•ด ๋ณธ๋‹ค ! ๐Ÿ˜Š