๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œํ’€์ด

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-1843] ์‚ฌ์น™์—ฐ์‚ฐ

by alswlfl 2026. 5. 2.

[DP-์‚ฌ์น™์—ฐ์‚ฐ]

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

๋ฌธ์ œ

์‚ฌ์น™์—ฐ์‚ฐ์—์„œ ๋”ํ•˜๊ธฐ(+)๋Š” ๊ฒฐํ•ฉ๋ฒ•์น™์ด ์„ฑ๋ฆฝํ•˜์ง€๋งŒ, ๋นผ๊ธฐ(-)๋Š” ๊ฒฐํ•ฉ๋ฒ•์น™์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ๋นผ๊ธฐ๋Š” ์—ฐ์‚ฐ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๋ฌธ์ž์—ด ํ˜•ํƒœ์˜ ์ˆซ์ž์™€, '+', '-'๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์„œ๋กœ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ˆœ์„œ์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ์ค‘ ์ตœ๋Œ“๋‹ถ returnํ•˜๋Š” solution ํ•จ์ˆ˜ ์™„์„ฑํ•˜๊ธฐ

 

์ œํ•œ์‚ฌํ•ญ

  • arr๋Š” ๋‘ ์—ฐ์‚ฐ์ž์™€ ์ˆซ์ž๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์ด๋ฉฐ, ๊ธธ์ด๋Š” 3 ์ด์ƒ 201 ์ดํ•˜์ด๋‹ค.
    • arr์˜ ๊ธธ์ด๋Š” ํ•ญ์ƒ ํ™€์ˆ˜
    • arr์— ๋“ค์–ด์žˆ๋Š” ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋Š” 2๊ฐœ ์ด์ƒ 101๊ฐœ ์ดํ•˜์ด๋ฉฐ, ์—ฐ์‚ฐ์ž์˜ ๊ฐœ์ˆ˜๋Š” -1์ด๋‹ค.
    • ์ˆซ์ž๋Š” 1 ์ด์ƒ 1,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋“ค์–ด์žˆ๋‹ค
  • ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ์™€ ๋งˆ์ง€๋ง‰ ์›์†Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ˆซ์ž์ด๋ฉฐ, ์ˆซ์ž์™€ ์—ฐ์‚ฐ์ž๊ฐ€ ํ•ญ์ƒ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ๋“ค์–ด์žˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

arr = ["1", "-", "3", "+", "5", "-", "8"], result = 1

arr = ["5", "-", "3", "+", "1", "+", "2", "-", "4"], result = 3

๋ฌธ์ œ ์ ‘๊ทผ

DFS๋กœ ํ’€๊ธฐ์—๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๋“ฏํ•œ ๋ฌธ์ œ์ธ ๋“ฏํ•˜๊ณ , DP๋กœ ์ ‘๊ทผํ•˜๊ธฐ์— ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋‹ค..ใ… 

์ด ๋ฌธ์ œ๋Š” ๋‘ ๊ฐ€์ง€ DP ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค. ์ตœ๋Œ“๊ฐ’ DP์™€ ์ตœ์†Ÿ๊ฐ’ DP

DP[i][j] = i๋ฒˆ์งธ๋ถ€ํ„ฐ j๋ฒˆ์งธ๊นŒ์ง€์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ

 

๋˜ํ•œ, ์—ฐ์‚ฐ์ž๊ฐ€ '+'์ธ ๊ฒฝ์šฐ์™€ '-'์ธ ๊ฒฝ์šฐ ์ตœ๋Œ“๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ์‹œ์ผœ์ฃผ๋Š” ์—ฐ์‚ฐ์ด ๋‹ค๋ฅด๋‹ค.

1) +์ธ ๊ฒฝ์šฐ

  • ์ตœ๋Œ€ = ์ตœ๋Œ€ + ์ตœ๋Œ€
  • ์ตœ์†Œ = ์ตœ์†Œ + ์ตœ์†Œ

2) -์ธ ๊ฒฝ์šฐ

  • ์ตœ๋Œ€ = ์ตœ๋Œ€ - ์ตœ์†Œ
  • ์ตœ์†Œ = ์ตœ์†Œ - ์ตœ๋Œ€

์œ„ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์˜ˆ์‹œ๋ฅผ ๊ทผ๊ฑฐ๋กœ ์ ‘๊ทผํ•ด๋ณด๋ฉด,

0 1 2 3 4 5 6
1 - 3 + 5 - 8

 

1. ์ฒ˜์Œ์— ๋ณธ์ธ ์ž์‹ , ์ฆ‰ i๋ฒˆ์งธ-i๋ฒˆ์งธ๋Š” ํ•ด๋‹น ์ˆซ์ž ์ฑ„์šฐ๊ธฐ(min_dp, max_dp)

min_dp

  0 1 2 3 4 5 6
0 1 x   x   x  
1 x x x x x x x
2   x 3 x   x  
3 x x x x x x x
4   x   x 5 x  
5 x x x x x x x
6   x   x   x 8

 

max_dp

  0 1 2 3 4 5 6
0 1 x   x   x  
1 x x x x x x x
2 x x 3 x   x  
3 x x x x x x x
4 x x x x 5 x  
5 x x x x x x x
6 x x x x x x 8

 

2. 3์ž๋ฆฌ๋ถ€ํ„ฐ arr ๋ฐฐ์—ด ๊ธธ์ด ์ž๋ฆฌ๊นŒ์ง€ ์‚ฌ์น™์—ฐ์‚ฐ ๊ณ„์‚ฐ

2-1) 3์ž๋ฆฌ์”ฉ ๋จผ์ € ํ™•์ธ -> 1-3, 3+5, 5-8

 

min_dp

  0 1 2 3 4 5 6
0 1 x -2 x   x  
1 x x x x x x x
2 x x 3 x 8 x  
3 x x x x x x x
4 x x x x 5 x -3
5 x x x x x x x
6 x x x x x x 8

 

max_dp

  0 1 2 3 4 5 6
0 1 x -2 x   x  
1 x x x x x x x
2 x x 3 x 8 x  
3 x x x x x x x
4 x x x x 5 x -3
5 x x x x x x x
6 x x x x x x 8

 

2-2) 3์ž๋ฆฌ์”ฉ ํ™•์ธ -> 1-3+5, 3+5-8 -> 1-(3+5) or (1-3)+5 / 3+(5-8) or (3+5)-8

min_dp

  0 1 2 3 4 5 6
0 1 x -2 x -7 x  
1 x x x x x x x
2 x x 3 x 8 x 0
3 x x x x x x x
4 x x x x 5 x -3
5 x x x x x x x
6 x x x x x x 8

 

max_dp

  0 1 2 3 4 5 6
0 1 x -2 x 3 x  
1 x x x x x x x
2 x x 3 x 8 x 0
3 x x x x x x x
4 x x x x 5 x -3
5 x x x x x x x
6 x x x x x x 8

 

2-3) 4์ž๋ฆฌ์”ฉ ํ™•์ธ -> 1-3+5-8 -> 1-(3+5-8) or (1-3)+(5-8) or (1-3+5)-8

min_dp

  0 1 2 3 4 5 6
0 1 x -2 x -7 x -15
1 x x x x x x x
2 x x 3 x 8 x 0
3 x x x x x x x
4 x x x x 5 x -3
5 x x x x x x x
6 x x x x x x 8

 

max_dp

  0 1 2 3 4 5 6
0 1 x -2 x 3 x 1
1 x x x x x x x
2 x x 3 x 8 x 0
3 x x x x x x x
4 x x x x 5 x -3
5 x x x x x x x
6 x x x x x x 8

 

3) ์ตœ์ข…์ ์œผ๋กœ max_dp[0][arr๋ฐฐ์—ด ๊ธธ์ด-1] ๋ฆฌํ„ด

์ฝ”๋“œ

function solution(arr) {
    var answer = -1;
    const len = arr.length;
    // DP[i][j] = i๋ฒˆ์งธ๋ถ€ํ„ฐ j๋ฒˆ์งธ๊นŒ์ง€์˜ ์—ฐ์‚ฐ
    const max_dp = Array.from({length: len}, () => Array.from({length: len}, () => 0)); // ์ตœ๋Œ“๊ฐ’ DP
    const min_dp = Array.from({length: len}, () => Array.from({length: len}, () => Number.MAX_SAFE_INTEGER)); // ์ตœ์†Ÿ๊ฐ’ DP
    
    // DP[i][i] = ๋ณธ์ธ ์ž์‹ ์€ ๊ทธ๋Œ€๋กœ์ž„
    for(let i=0; i<arr.length; i+=2) {
        max_dp[i][i] = +arr[i];
        min_dp[i][i] = +arr[i];
    } 
    
    for(let count=3; count<len+1;count+=2){
        for(let left=0; left<len-2; left+=2){
            let right = left+count-1;
            if(right >= len) break;
            
            const candidates = [];
            for(let operation=left+1; operation<right; operation+=2) {
                if(arr[operation] === '+') {
                    // ์ตœ๋Œ€ = ์ตœ๋Œ€+์ตœ๋Œ€
                    candidates.push(max_dp[left][operation-1]+max_dp[operation+1][right]);
                    // ์ตœ์†Œ = ์ตœ์†Œ+์ตœ์†Œ
                    candidates.push(min_dp[left][operation-1]+min_dp[operation+1][right]);
                }else {
                    // ์ตœ๋Œ€ = ์ตœ๋Œ€-์ตœ์†Œ
                    candidates.push(max_dp[left][operation-1]-min_dp[operation+1][right]);
                    // ์ตœ์†Œ = ์ตœ์†Œ-์ตœ๋Œ€
                    candidates.push(min_dp[left][operation-1]-max_dp[operation+1][right]);
                }
            }
            max_dp[left][right] = Math.max(...candidates);
            min_dp[left][right] = Math.min(...candidates);
        }
    }
    return max_dp[0][len-1];
}