๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์‚ฌ์น™์—ฐ์‚ฐ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 1. 31.

<๋ฌธ์ œ ๋งํฌ>

https://school.programmers.co.kr/learn/courses/30/lessons/1843

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

<ํ’€์ด ์ „๋žต>

1. ๋งค์šฐ ์–ด๋ ค์› ๋˜ dp + ๋ถ„ํ• ์ •๋ณต ๋ฌธ์ œ

2. ์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž ๋’ค ๊ตฌ๊ฐ„์„ ๋‚˜๋ˆ„์–ด์„œ ๊ณ„์‚ฐํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (๊ตฌ๊ฐ„ํ•ฉ๊ณผ ์œ ์‚ฌ)

10๊ฐœ์˜ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

[1] ~ [2 ~ 10]
[1 ~ 2] ~ [3 ~ 10]
[1 ~ 3] ~ [4 ~ 10]
...
[1 ~ 9] ~ [10]

3. - ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ตœ๋Œ“๊ฐ’ ํ…Œ์ด๋ธ”๊ณผ ์ตœ์†Ÿ๊ฐ’ ํ…Œ์ด๋ธ” ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค

4. ๊ตฌ๊ฐ„์˜ ๊ธธ์ด (1 ~ N - 1)๋งˆ๋‹ค ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ํ•ด๋‹น ๊ตฌ๊ฐ„ ๋‚ด์—์„œ ๋‹ค์‹œ ์‹œ์ž‘(i)๊ณผ ๋(j) ํ”ผ์—ฐ์‚ฐ์ž์— ์‚ฌ์ด์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ(k) ๊ตฌ๊ฐ„์˜ ๋ˆ„์  ์—ฐ์‚ฐ (์ตœ์†Œ/์ตœ๋Œ€)๊ฐ’์„ ๊ตฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

5. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ตœ๋Œ“๊ฐ’ ํ…Œ์ด๋ธ” dp_max[0][N - 1]์€ arr์˜ ์ฒซ๋ฒˆ์จฐ ํ”ผ์—ฐ์‚ฐ์ž๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํ”ผ์—ฐ์‚ฐ์ž ๊ตฌ๊ฐ„, ์ฆ‰ ์ „์ฒด ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

6. dp๋ผ๋Š” ๊ฑธ ์•Œ๊ณ  ํ‘ผ ์ƒํƒœ์—์„œ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ตฌ๊ฐ„ํ•ฉ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ๊ฒ ๋‹ค๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ ํ™”์‹์ด๋‚˜ dp ํ…Œ์ด๋ธ”์„ ์–ด๋–ป๊ฒŒ ์งœ์•ผ๋ ์ง€ ๊ฐ์ด ์•ˆ ์™€์„œ ๊ฒ€์ƒ‰ํ•ด์„œ ํ’€์—ˆ๋‹ค. ์•„๋งˆ ์‚ฌ์ „ ์ •๋ณด ์—†์ด ์‹œํ—˜์žฅ์—์„œ ๋ดค๋‹ค๋ฉด ์ ˆ๋Œ€ ๋ชป ํ’€์—ˆ์„ ๋ฌธ์ œ... ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค

 

<์ •๋‹ต ์ฝ”๋“œ>

import sys

# 230125 ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์‚ฌ์น™์—ฐ์‚ฐ

def solution(arr):
    answer = -1

    N = len(arr)//2 + 1
    INF = sys.maxsize

    # dp ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™” (๋ฒ”์œ„์— ๋”ฐ๋ฅธ ์ตœ์†Ÿ๊ฐ’ ์ตœ๋Œ“๊ฐ’ ์—ฐ์‚ฐ ํ…Œ์ด๋ธ”)
    # arr[i][j] = i๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž ~ j๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๊นŒ์ง€ ์—ฐ์‚ฐ์˜ ์ตœ์†Ÿ๊ฐ’/์ตœ๋Œ“๊ฐ’
    dp_min = [[INF for _ in range(101)] for _ in range(101)]
    dp_max = [[-INF for _ in range(101)] for _ in range(101)]

    for i in range(0, N):
        dp_min[i][i] = int(arr[i * 2])
        dp_max[i][i] = int(arr[i * 2])

    # ๊ณ„์‚ฐ ๋ฒ”์œ„
    for calculate_range in range(1, N):
        # i: ์‹œ์ž‘ ํ”ผ์—ฐ์‚ฐ์ž
        for i in range(0, N - calculate_range):
            # j: ๋งˆ์ง€๋ง‰ ํ”ผ์—ฐ์‚ฐ์ž
            j = calculate_range + i

            for k in range(i, j):

                # + ์—ฐ์‚ฐ์ž
                if arr[k*2 + 1] == '+':
                    dp_max[i][j] = max(dp_max[i][j], dp_max[i][k] + dp_max[k + 1][j])
                    dp_min[i][j] = min(dp_min[i][j], dp_min[i][k] + dp_min[k + 1][j])
                # - ์—ฐ์‚ฐ์ž
                else:
                    dp_max[i][j] = max(dp_max[i][j], dp_max[i][k] - dp_min[k + 1][j])
                    dp_min[i][j] = min(dp_min[i][j], dp_min[i][k] - dp_max[k + 1][j])

    answer = dp_max[0][N - 1]

    return answer

๋Œ“๊ธ€