๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿ—‚๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ๋•…๋”ฐ๋จน๊ธฐ

by ์‚๋šค์˜ค๋ฆฌ 2025. 10. 13.

๋ฌธ์ œ ์„ค๋ช…

https://school.programmers.co.kr/learn/courses/30/lessons/12913?language=java

๋•…๋”ฐ๋จน๊ธฐ ๊ฒŒ์ž„์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋•…๋”ฐ๋จน๊ธฐ ๊ฒŒ์ž„์˜ ๋•…(land)์€ ์ด Nํ–‰ 4์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๋ชจ๋“  ์นธ์—๋Š” ์ ์ˆ˜๊ฐ€ ์“ฐ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. 1ํ–‰๋ถ€ํ„ฐ ๋•…์„ ๋ฐŸ์œผ๋ฉฐ ํ•œ ํ–‰์”ฉ ๋‚ด๋ ค์˜ฌ ๋•Œ, ๊ฐ ํ–‰์˜ 4์นธ ์ค‘ ํ•œ ์นธ๋งŒ ๋ฐŸ์œผ๋ฉด์„œ ๋‚ด๋ ค์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋•…๋”ฐ๋จน๊ธฐ ๊ฒŒ์ž„์—๋Š” ํ•œ ํ–‰์”ฉ ๋‚ด๋ ค์˜ฌ ๋•Œ, ๊ฐ™์€ ์—ด์„ ์—ฐ์†ํ•ด์„œ ๋ฐŸ์„ ์ˆ˜ ์—†๋Š” ํŠน์ˆ˜ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด,

| 1 | 2 | 3 | 5 |

| 5 | 6 | 7 | 8 |

| 4 | 3 | 2 | 1 |

๋กœ ๋•…์ด ์ฃผ์–ด์กŒ๋‹ค๋ฉด, 1ํ–‰์—์„œ ๋„ค ๋ฒˆ์งธ ์นธ (5)๋ฅผ ๋ฐŸ์•˜์œผ๋ฉด, 2ํ–‰์˜ ๋„ค ๋ฒˆ์งธ ์นธ (8)์€ ๋ฐŸ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€ ๋ชจ๋‘ ๋‚ด๋ ค์™”์„ ๋•Œ, ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ ์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’์„ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”. ์œ„ ์˜ˆ์˜ ๊ฒฝ์šฐ, 1ํ–‰์˜ ๋„ค ๋ฒˆ์งธ ์นธ (5), 2ํ–‰์˜ ์„ธ ๋ฒˆ์งธ ์นธ (7), 3ํ–‰์˜ ์ฒซ ๋ฒˆ์งธ ์นธ (4) ๋•…์„ ๋ฐŸ์•„ 16์ ์ด ์ตœ๊ณ ์ ์ด ๋˜๋ฏ€๋กœ 16์„ return ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ œํ•œ ์‚ฌํ•ญ

  • ํ–‰์˜ ๊ฐœ์ˆ˜ N : 100,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜
  • ์—ด์˜ ๊ฐœ์ˆ˜๋Š” 4๊ฐœ์ด๊ณ , ๋•…(land)์€ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ ์ˆ˜ : 100 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜

์ž…์ถœ๋ ฅ ์˜ˆ

land answer
[[1, 2, 3, 5], [5, 6, 7, 8], [4, 3, 2, 1]] 16

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

  • ๋ฌธ์ œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

class Solution {
    int solution(int[][] land) {
        // ์ตœ์ข… ์ ์ˆ˜๋ฅผ ์ €์žฅํ•œ ๋ณ€์ˆ˜ ์ƒ์„ฑ
        int answer = 0;
        // ๋ฐฐ์—ด์˜ ๊ธธ์ด ์ €์žฅ
        int len = land.length;
        
        // ๋ฐ˜๋ณต๋ฌธ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ, ๋ˆ„์  ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ
        for (int i = 1; i < len; i++) {
            land[i][0] += Math.max(Math.max(land[i-1][1], land[i-1][2]), land[i-1][3]);
            land[i][1] += Math.max(Math.max(land[i-1][0], land[i-1][2]), land[i-1][3]);
            land[i][2] += Math.max(Math.max(land[i-1][0], land[i-1][1]), land[i-1][3]);
            land[i][3] += Math.max(Math.max(land[i-1][0], land[i-1][1]), land[i-1][2]);
        }
        
        // ๋งˆ์ง€๋ง‰ ํ–‰ ๋ณ€์ˆ˜
        int lastRow = len -1;
        // ๋งˆ์ง€๋ง‰ ํ–‰์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์ •๋‹ต
        for (int j = 0; j < 4; j++) {
            answer = Math.max(answer, land[lastRow][j]);
        }
        
        // ์ •๋‹ต ๋ฐ˜ํ™˜
        return answer;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ๋Š” ๊ฐ ํ–‰์—์„œ ์ด์ „ ์—ด๋งŒ ๋ฐŸ์ง€ ์•Š์œผ๋ฉด ๋˜๋‹ˆ๊นŒ, ๋‹จ์ˆœํžˆ ๋งค ํ–‰๋งˆ๋‹ค ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ณ ๋ฅด๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ „์— ์„ ํƒํ•œ ์—ด์„ oldColumn ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•ด๋‘๊ณ , ํ˜„์žฌ ํ–‰์—์„œ ๊ทธ ์—ด์„ ์ œ์™ธํ•œ ๊ฐ’๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋”ํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ฆ‰, ๋งค ์ˆœ๊ฐ„์˜ ์ตœ๋Œ“๊ฐ’์„ ์„ ํƒํ•˜๋Š” ๊ทธ๋ฆฌ๋””(ํƒ์š•์ ) ์ ‘๊ทผ์ด์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ณฐ๊ณฐ์ด ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, “์ด ๋ฐฉ์‹์ด ํ•ญ์ƒ ์ตœ์„ ์ผ๊นŒ?” ํ•˜๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค. ๋งŒ์•ฝ ํ•œ ํ–‰์—์„œ ํฐ ๊ฐ’์„ ์„ ํƒํ•œ ํƒ“์—, ๋‹ค์Œ ํ–‰์—์„œ ํ›จ์”ฌ ๋” ํฐ ๊ฐ’์„ ๋†“์น˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์ „์ฒด ํ•ฉ์€ ์ตœ๋Œ“๊ฐ’์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์‹ค์ œ๋กœ ๋ฐ˜๋ก€๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋‹ˆ, ์ฒซ ๋ฒˆ์งธ ํ–‰์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ๋‹ค์Œ ํ–‰์˜ ์„ ํƒ ํญ์„ ์ค„์—ฌ ์ „์ฒด ํ•ฉ์ด ์ž‘์•„์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ์ง€์ ์—์„œ ๊ทธ๋ฆฌ๋”” ๋ฐฉ์‹์€ ๊ตญ์†Œ ์ตœ์ ํ•ด(local optimum)์— ๋จธ๋ฌผ ๋ฟ, ์ „์—ญ ์ตœ์ ํ•ด(global optimum)๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ–ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๊ฒฐ๊ตญ “ํ˜„์žฌ์˜ ์„ ํƒ์ด ๋‹ค์Œ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ค€๋‹ค”๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ํ•œ ํ–‰๋งŒ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด์ „ ํ–‰์—์„œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ˆ„์ ํ•ด์„œ ๊ณ ๋ คํ•ด์•ผ ํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ”๋กœ ๋™์  ๊ณ„ํš๋ฒ•(DP, Dynamic Programming) ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋‹ค.

DP๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ์ƒํƒœ๋ฅผ ์ •์˜ํ–ˆ๋‹ค. dp[i][j]๋ฅผ “i๋ฒˆ์งธ ํ–‰์˜ j์—ด์„ ๋ฐŸ์•˜์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ ์ˆ˜”๋กœ ๋‘์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ ์ค‘, ๋ฐ”๋กœ ์œ—ํ–‰์—์„œ ๊ฐ™์€ ์—ด์„ ์ œ์™ธํ•œ ๊ณณ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ๋”ํ•ด์ฃผ๋Š” ์ ํ™”์‹์„ ์„ธ์› ๋‹ค.

dp[i][j] = land[i][j] + max(dp[i-1][k])  (๋‹จ, k ≠ j)

์ด ์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ 2ํ–‰๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํ–‰๊นŒ์ง€ ์ฐจ๋ก€๋กœ ๋ˆ„์  ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฉด, ๋งˆ์ง€๋ง‰ ํ–‰์—๋Š” ๊ฐ ๊ฒฝ๋กœ๋ณ„๋กœ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ“๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ํ–‰์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๊ทธ๊ฒƒ์ด ๊ณง ์ •๋‹ต์ด ๋œ๋‹ค.

์ด ๋ฐฉ์‹์€ ๊ทธ๋ฆฌ๋”” ์ ‘๊ทผ์˜ ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๋ฉฐ, ๋งค ํ–‰์˜ ๊ฐ€๋Šฅํ•œ ์„ ํƒ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ด ์ตœ์ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ “ํ•ญ์ƒ ๊ฐ€์žฅ ์ปค ๋ณด์ด๋Š” ๊ฐ’์„ ๊ณ ๋ฅธ๋‹ค๊ณ  ํ•ด์„œ ์ตœ์ ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค”๋Š” ์ ์„ ๋ฐฐ์› ๊ณ , ํ˜„์žฌ ์„ ํƒ์ด ๋ฏธ๋ž˜์˜ ๊ฐ€๋Šฅ์„ฑ์— ์–ด๋–ค ์ œ์•ฝ์„ ์ฃผ๋Š”์ง€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋А๊ผˆ๋‹ค.
์•ž์œผ๋กœ ๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚˜๋ฉด, ๋‹จ์ˆœํ•œ ์ตœ๋Œ“๊ฐ’ ์„ ํƒ๋ณด๋‹ค ์ด์ „ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ˆ„์  ์ตœ์ ํ™”(DP ์‚ฌ๊ณ ) ๋ฅผ ๋จผ์ € ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ํ•™์Šต์˜ ํ•ต์‹ฌ์ด์—ˆ๋‹ค.