[Boj_17485] ์ง„์šฐ์˜ ๋‹ฌ ์—ฌํ–‰ (Large)

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

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

 

โ–ธ ๋ฌธ์ œ

์šฐ์ฃผ๋น„ํ–‰์ด ๊ฟˆ์ด์˜€๋˜ ์ง„์šฐ๋Š” ์Œ์‹์  '๋งค์ผ๋งค์ผ์‹ฑ์‹ฑ'์—์„œ ์—ด์‹ฌํžˆ ์ผํ•œ ๊ฒฐ๊ณผ ๋‹ฌ ์—ฌํ–‰์— ํ•„์š”ํ•œ ์ž๊ธˆ์„ ๋ชจ๋‘ ๋งˆ๋ จํ•˜์˜€๋‹ค! ์ง€๊ตฌ์™€ ์šฐ์ฃผ์‚ฌ์ด๋Š” N X M ํ–‰๋ ฌ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ์›์†Œ์˜ ๊ฐ’์€ ์šฐ์ฃผ์„ ์ด ๊ทธ ๊ณต๊ฐ„์„ ์ง€๋‚  ๋•Œ ์†Œ๋ชจ๋˜๋Š” ์—ฐ๋ฃŒ์˜ ์–‘์ด๋‹ค.

[์˜ˆ์‹œ]

์ง„์šฐ๋Š” ์—ฌํ–‰๊ฒฝ๋น„๋ฅผ ์•„๋ผ๊ธฐ ์œ„ํ•ด ์กฐ๊ธˆ ํŠน์ดํ•œ ์šฐ์ฃผ์„ ์„ ์„ ํƒํ•˜์˜€๋‹ค. ์ง„์šฐ๊ฐ€ ์„ ํƒํ•œ ์šฐ์ฃผ์„ ์˜ ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. ์ง€๊ตฌ -> ๋‹ฌ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ ์šฐ์ฃผ์„ ์ด ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

2. ์šฐ์ฃผ์„ ์€ ์ „์— ์›€์ง์ธ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‘๋ฒˆ ์—ฐ์†์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์—†๋‹ค.

์ง„์šฐ์˜ ๋ชฉํ‘œ๋Š” ์—ฐ๋ฃŒ๋ฅผ ์ตœ๋Œ€ํ•œ ์•„๋ผ๋ฉฐ ์ง€๊ตฌ์˜ ์–ด๋А์œ„์น˜์—์„œ๋“  ์ถœ๋ฐœํ•˜์—ฌ ๋‹ฌ์˜ ์–ด๋А์œ„์น˜๋“  ์ฐฉ๋ฅ™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ตœ๋Œ€ํ•œ ๋ˆ์„ ์•„๋ผ๊ณ  ์‚ด์•„์„œ ๋‹ฌ์— ๋„์ฐฉํ•˜๊ณ  ์‹ถ์€ ์ง„์šฐ๋ฅผ ์œ„ํ•ด ๋‹ฌ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์—ฐ๋ฃŒ์˜ ์ตœ์†Œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ์ฃผ์ž.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์ค„์— ์ง€๊ตฌ์™€ ๋‹ฌ ์‚ฌ์ด ๊ณต๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ–‰๋ ฌ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” N, M (2 ≤ N, M ≤ 1000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‹ค์Œ N์ค„ ๋™์•ˆ ๊ฐ ํ–‰๋ ฌ์˜ ์›์†Œ ๊ฐ’์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ–‰๋ ฌ์˜ ์›์†Œ๊ฐ’์€ 100 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

๋‹ฌ ์—ฌํ–‰์— ํ•„์š”ํ•œ ์ตœ์†Œ ์—ฐ๋ฃŒ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

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

 

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

์ด ๋ฌธ์ œ๋Š” ์ด์ „ ์ด๋™ ๋ฐฉํ–ฅ์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด ๋‚˜๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ 3์ฐจ์› DP๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

int[][][] dp = new int[n][m][3]; // d ๋ฐฉํ–ฅ์œผ๋กœ ์˜จ (i, j) ์œ„์น˜

 

1๏ธโƒฃ ์ฒซ ๋ฒˆ์งธ ์—ด (j == 0)

(i, 0) ์ขŒํ‘œ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ

  • 0๋ฒˆ ๋ฐฉํ–ฅ(โ†™)์œผ๋กœ ๋„์ฐฉํ•œ ๊ฒฝ์šฐ: ์ง์ „์€ 1๋ฒˆ(↓) ๋˜๋Š” 2๋ฒˆ(โ†˜)๋งŒ ๊ฐ€๋Šฅ
  • 1๋ฒˆ ๋ฐฉํ–ฅ(↓)์œผ๋กœ ๋„์ฐฉํ•œ ๊ฒฝ์šฐ: ์ง์ „์€ 0๋ฒˆ(โ†™)๋งŒ ๊ฐ€๋Šฅ

์ด ๋ฌธ์ œ๋Š” ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‘ ๋ฒˆ ์—ฐ์† ์ด๋™ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋Šฅํ•œ ์ด์ „ ๋ฐฉํ–ฅ์„ ๊ณ ๋ คํ•ด DP๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์‹œ

if (j == 0) {
    // (i, j)๊ฐ€ 0๋ฒˆ ๋ฐฉํ–ฅ์œผ๋กœ ์™”๋‹ค๋ฉด: ์ด์ „ ์œ„์น˜๋Š” (i-1, j+1)์—์„œ 1 or 2 ๋ฐฉํ–ฅ์œผ๋กœ ์™”์–ด์•ผ ํ•จ
    dp[i][j][0] = Math.min(dp[i-1][j+1][1], dp[i-1][j+1][2]) + map[i][j];
    // (i, j)๊ฐ€ 1๋ฒˆ ๋ฐฉํ–ฅ์œผ๋กœ ์™”๋‹ค๋ฉด: ์ด์ „ ์œ„์น˜๋Š” (i-1, j)์—์„œ 0๋ฒˆ ๋ฐฉํ–ฅ๋งŒ ๊ฐ€๋Šฅ
    dp[i][j][1] = dp[i-1][j][0] + map[i][j];
}

 

2๏ธโƒฃ ๋งˆ์ง€๋ง‰ ์—ด (j == m-1)

(i, m-1) ์ขŒํ‘œ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ

  • 1๋ฒˆ ๋ฐฉํ–ฅ(↓)์œผ๋กœ ๋„์ฐฉํ•œ ๊ฒฝ์šฐ: ์ง์ „์€ 2๋ฒˆ ๋ฐฉํ–ฅ(โ†˜)๋งŒ ๊ฐ€๋Šฅ
  • 2๋ฒˆ ๋ฐฉํ–ฅ(โ†˜)์œผ๋กœ ๋„์ฐฉํ•œ ๊ฒฝ์šฐ: ์ง์ „์€ 0๋ฒˆ(โ†™) ๋˜๋Š” 1๋ฒˆ(↓) ๋ฐฉํ–ฅ๋งŒ ๊ฐ€๋Šฅ

์˜ค๋ฅธ์ชฝ ๋ ์—ด์—์„œ๋Š” 0๋ฒˆ ๋ฐฉํ–ฅ(โ†™)์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋Šฅํ•œ ์ด์ „ ๋ฐฉํ–ฅ์„ ๊ณ ๋ คํ•ด DP๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์‹œ

if (j == m - 1) {
    // (i, j)๊ฐ€ 1๋ฒˆ ๋ฐฉํ–ฅ(↓)์œผ๋กœ ์™”๋‹ค๋ฉด: ์ด์ „ ์œ„์น˜๋Š” (i-1, j)์—์„œ 2๋ฒˆ ๋ฐฉํ–ฅ๋งŒ ๊ฐ€๋Šฅ
    dp[i][j][1] = dp[i - 1][j][2] + map[i][j];
    // (i, j)๊ฐ€ 2๋ฒˆ ๋ฐฉํ–ฅ(โ†˜)์œผ๋กœ ์™”๋‹ค๋ฉด: ์ด์ „ ์œ„์น˜๋Š” (i-1, j-1)์—์„œ 0๋ฒˆ ๋˜๋Š” 1๋ฒˆ ๋ฐฉํ–ฅ ๊ฐ€๋Šฅ
    dp[i][j][2] = Math.min(dp[i - 1][j - 1][0], dp[i - 1][j - 1][1]) + map[i][j];
}

 

3๏ธโƒฃ ์ค‘๊ฐ„ ์—ด (1 ≤ j ≤ m - 2)

(i, j) ์ขŒํ‘œ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ, ์„ธ ๊ฐ€์ง€ ๋ฐฉํ–ฅ ๋ชจ๋‘์—์„œ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค๋งŒ, ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋‘ ๋ฒˆ ์—ฐ์† ์ด๋™ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ง์ „ ๋ฐฉํ–ฅ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฐฉํ–ฅ๋“ค ์ค‘์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ์„ ํƒํ•ด DP๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

๐Ÿ’ก ์˜ˆ์‹œ ์„ค๋ช…

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์œ„์น˜๊ฐ€ (i, j)๋ผ๊ณ  ํ•˜๋ฉด:

  • 0๋ฒˆ ๋ฐฉํ–ฅ(โ†™)์œผ๋กœ ์˜จ ๊ฒฝ์šฐ: ์ง์ „์—๋Š” 1๋ฒˆ(↓) ๋˜๋Š” 2๋ฒˆ(โ†˜)๋งŒ ๊ฐ€๋Šฅ
  • 1๋ฒˆ ๋ฐฉํ–ฅ(↓)์œผ๋กœ ์˜จ ๊ฒฝ์šฐ: ์ง์ „์—๋Š” 0๋ฒˆ(โ†™) ๋˜๋Š” 2๋ฒˆ(โ†˜)๋งŒ ๊ฐ€๋Šฅ
  • 2๋ฒˆ ๋ฐฉํ–ฅ(โ†˜)์œผ๋กœ ์˜จ ๊ฒฝ์šฐ: ์ง์ „์—๋Š” 0๋ฒˆ(โ†™) ๋˜๋Š” 1๋ฒˆ(↓)๋งŒ ๊ฐ€๋Šฅ

 

๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์‹œ

if (j > 0 && j < m - 1) {
    // (i, j)๊ฐ€ 0๋ฒˆ ๋ฐฉํ–ฅ(โ†™)์œผ๋กœ ์™”๋‹ค๋ฉด: ์ด์ „ ์œ„์น˜๋Š” (i-1, j+1)์—์„œ 1๋ฒˆ ๋˜๋Š” 2๋ฒˆ ๋ฐฉํ–ฅ ๊ฐ€๋Šฅ
    dp[i][j][0] = Math.min(dp[i - 1][j + 1][1], dp[i - 1][j + 1][2]) + map[i][j];
    // (i, j)๊ฐ€ 1๋ฒˆ ๋ฐฉํ–ฅ(↓)์œผ๋กœ ์™”๋‹ค๋ฉด: ์ด์ „ ์œ„์น˜๋Š” (i-1, j)์—์„œ 0๋ฒˆ ๋˜๋Š” 2๋ฒˆ ๋ฐฉํ–ฅ ๊ฐ€๋Šฅ
    dp[i][j][1] = Math.min(dp[i - 1][j][0], dp[i - 1][j][2]) + map[i][j];
    // (i, j)๊ฐ€ 2๋ฒˆ ๋ฐฉํ–ฅ(โ†˜)์œผ๋กœ ์™”๋‹ค๋ฉด: ์ด์ „ ์œ„์น˜๋Š” (i-1, j-1)์—์„œ 0๋ฒˆ ๋˜๋Š” 1๋ฒˆ ๋ฐฉํ–ฅ ๊ฐ€๋Šฅ
    dp[i][j][2] = Math.min(dp[i - 1][j - 1][0], dp[i - 1][j - 1][1]) + map[i][j];
}

 

๋งˆ์ง€๋ง‰ ํ–‰์˜ ๋ชจ๋“  ์—ด์—์„œ, ์„ธ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋‹ฌ ์—ฌํ–‰์— ํ•„์š”ํ•œ ์ตœ์†Œ ์—ฐ๋ฃŒ์˜ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

 

โœ” ์ฝ”๋“œ

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

public class Main {
    static final int INF = 987654321;
    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 m = Integer.parseInt(st.nextToken());

        int[][] map = new int[n][m];
        int[][][] dp = new int[n][m][3]; // d ๋ฐฉํ–ฅ์œผ๋กœ ์˜จ (i, j) ์œ„์น˜
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                Arrays.fill(dp[i][j], INF);
            }
        }

        // ์ดˆ๊ธฐ ์„ค์ •
        for (int j = 0; j < m; j++) {
            dp[0][j][0] = map[0][j];
            dp[0][j][1] = map[0][j];
            dp[0][j][2] = map[0][j];
        }

        for (int i = 1; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (j == 0) {
                    dp[i][j][0] = Math.min(dp[i-1][j+1][1], dp[i-1][j+1][2]) + map[i][j];
                    dp[i][j][1] = dp[i-1][j][0] + map[i][j];
                } else if (j == m-1) {
                    dp[i][j][2] = Math.min(dp[i-1][j-1][1], dp[i-1][j-1][0]) + map[i][j];
                    dp[i][j][1] = dp[i-1][j][2] + map[i][j];
                } else {
                    dp[i][j][2] = Math.min(dp[i-1][j-1][0], dp[i-1][j-1][1]) + map[i][j];
                    dp[i][j][1] = Math.min(dp[i-1][j][2], dp[i-1][j][0]) + map[i][j];
                    dp[i][j][0] = Math.min(dp[i-1][j+1][1], dp[i-1][j+1][2]) + map[i][j];
                }
            }
        }

        int min = INF;
        for (int j = 0; j < m; j++) {
            for (int i = 0; i < 3; i++) {
                min = Math.min(min, dp[n-1][j][i]);
            }
        }

        System.out.println(min);

        br.close();
    }
}

 

dp๋ฅผ ๋”์ฐ์ด๋„ ์‹ซ์–ดํ•˜๋˜ ๋‚œ๋ฐ.. ์š”์ฆ˜์—” ํฅ๋ฏธ๊ฐ€ ์ƒ๊ฒจ ์‚ด์ง ์žฌ๋ฐŒ๊ฒŒ ๋А๊ปด์ง„๋‹ค!
๋ฌผ๋ก  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€๋งŒ ์—ด์‹ฌํžˆ ํ’€๋‹ค ๋ณด๋ฉด ํ˜ผ์ž ํ•ด๊ฒฐํ•˜๋Š” ๋‚ ๋„ ๋Š˜์–ด๋‚˜๊ฒ ์ง€...! ๐Ÿ˜œ

 

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Boj_1263] ์‹œ๊ฐ„ ๊ด€๋ฆฌ  (0) 2025.05.11
[Boj_15980] ๋ช…์ƒ ๋ฐฉํ•ด๊พผ  (0) 2025.04.16
[Boj_7579] ์•ฑ  (0) 2025.03.25
[Boj_1577] ๋„๋กœ์˜ ๊ฐœ์ˆ˜  (0) 2025.03.19
[Boj_19542] ์ „๋‹จ์ง€ ๋Œ๋ฆฌ๊ธฐ  (0) 2025.03.17