CHAPTER 04 ๋‹ค์ด๋‚ด๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ์šฉ ์ „๋žต

  1. ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ด ํ’€์ด๋ฒ• ์ž‘์„ฑํ•˜๊ธฐ
  2. ๋ฌธ์ œ์˜ ๋‚œ์ด๋„์™€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ DP๋‚˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์ด๋ฒ• ๊ฐœ์„ ํ•˜๊ธฐ

4.1 ์„ธ ๋ฐฉ๋ฒ•์„ ์ฐจ๋ก€๋Œ€๋กœ ์ ์šฉํ•˜๋ฉฐ ๋ฌธ์ œ ํ’€๊ธฐ

ํ–‰๋ ฌ์—์„œ ์ตœ์†Œ ์ด๋™ ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

๋น„์šฉ ํ–‰๋ ฌ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ–‰๋ ฌ์˜ ๊ฐ€์žฅ ์ขŒ์ƒ๋‹จ ์…€์—์„œ ๊ฐ€์žฅ ์šฐํ•˜๋‹จ ์…€๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ๋“œ๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

  • ๋‹จ ์•„๋ž˜์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ์”ฉ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

1. ์žฌ๊ท€ ํ˜ธ์ถœ

์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜ํ•œ ํ›„, ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

def minPathCose(cost, m, n) :
    x = minPathCost(cost, m-1, n)
    y = minPathCost(cost, m, n-1)
    return getMin(x, y) + cost[m][n];

์œ„ ์ฝ”๋“œ์—์„œ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด๋ณด์ž.

  1. m๊ณผ n ๋ชจ๋‘ 0์ธ ๊ฒฝ์šฐ : ์ถœ๋ฐœ์ง€๊ฐ€ ๋ชฉ์ ์ง€์ธ ๊ฒฝ์šฐ -> cost[0][0] ๋ฆฌํ„ด
  2. m == 0 && n != 0 : ์˜ค๋ฅธ์ชฝ์œผ๋กœ๋งŒ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ”๋กœ ์™ผ์ชฝ ์…€์˜ ์ตœ์†Œ ์ด๋™ ๋น„์šฉ + ํ˜„์ œ ์…€์˜ ๋น„์šฉ
  3. m != 0 && n == 0 : ์•„๋ž˜๋กœ๋งŒ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐœ ์œ„ ์…€์˜ ์ตœ์†Œ ์ด๋™ ๋น„์šฉ + ํ˜„์žฌ ์…€์˜ ๋น„์šฉ

์ด ๊ฒฝ์šฐ์—์„œ 1๋ฒˆ์€ ์ข…๋ฃŒ์กฐ๊ฑด์ด์ง€๋งŒ 2, 3๋ฒˆ์€ ํŠน์ •ํ•œ ์กฐ๊ฑด์ผ ๋ฟ์ด๊ณ  ์ข…๋ฃŒ ์กฐ๊ฑด์€ ์•„๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋ฐ˜์˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด๋ณด์ž.

def getMin(a, b) :
    return a if a < b else b 

def minPathCost(cost, m, n) :
    if m == 0 && n == 0 : return cost[0][0]
    if m == 0 : return minPathCost(cost, 0, n-1) + cost[0][n]
    if n == 0 : return minPathCost(cost, m-1, 0) + cost[m][0]

    x = minPathCost(cost, m-1, n)
    y = minPathCost(cost, m, n-1)
    return getMin(x, y) + cost[m][n];
  • ๋ฌธ์ œ์  : ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ์ค‘๋ณต์ ์œผ๋กœ ํ•˜๊ฒŒ ๋œ๋‹ค. ์žฌ๊ท€ํ˜ธ์ถœ์ด๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

2. ๋ฉ”๋ชจ ์ „๋žต

ํ•œ๋ฒˆ ํ˜ธ์ถœํ•œ ์ธ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ์ „๋žต์„ ์‚ฌ์šฉํ•˜์ž!

def getMin(a, b) :
    return a if a < b else b 

def minPathCost(cost, m, n) :
    # ์ด๋ฏธ ์บ์‹ฑ
    if MEM[m][n] != 0 : return MEM[m][n]

    if m == 0 && n == 0 : return cost[0][0]
    elif m == 0 : return minPathCost(cost, 0, n-1) + cost[0][n]
    elif n == 0 : return minPathCost(cost, m-1, 0) + cost[m][0]
    else :
        x = minPathCost(cost, m-1, n)
        y = minPathCost(cost, m, n-1)
        MEM[m][n] = getMin(x, y) + cost[m][n]
    
    return MEM[m][n]
  • ์žฌ๊ท€ ํ˜ธ์ถœ์€ ์กด์žฌํ•˜์ง€๋งŒ ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•œ ํ•˜์œ„ ๋ฌธ์ œ๋Š” ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

3. ์ƒํ–ฅ์‹ ๋‹ค์ด๋‚ด๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

def getMin(a, b) :
    return a if a < b else b 

def minPathCost(cost, m, n) :
    # ์ด๋ฏธ ์บ์‹ฑ
    MEM[0][0] = cose[0][0]

    for j in range (1, N) :
        MEM[0][j] = MEM[0][j-1] + cost[0][j]

    for i in range (1, N) :
        MEM[i][0] = MEM[i-1][0] + cost[i][0]
    
    for i in range(1, M):
        for j in range(1, N) :
            MEM[i][j] = getMin(MEM[i-1][j], MEM[i][j-1]) + cost[i][j];
    
    return MEM[M-1][N-1];

4.2 ๋‹ค์ด๋‚ด๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ

DP์˜ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฐ€์žฅ ํ™•์‹คํ•˜๊ฒŒ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ๋ฌธ์ œ๊ฐ€ ์ตœ์ ์˜ ํ•˜์œ„๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€?
  2. ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๊ณ„์‚ฐํ•˜๊ณ  ์žˆ๋Š”๊ฐ€?

์–ด๋–ค ๊ฐ’์„ ์ตœ์ ํ™”, ์ตœ๋Œ€ํ™”, ์ตœ์†Œํ™”ํ•˜๊ฑฐ๋‚˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๊ฐ€ ์ตœ์ ์˜ ํ•˜์œ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๋•Œ ๊ณ ๋ คํ•ด๋ณด์ž!

DP๋กœ ๋ฌธ์ œ ํ’€๊ธฐ! ๐Ÿง˜โ€โ™‚๏ธ

  1. DP๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  2. ์ ํ™”์‹ ๋˜๋Š” ์žฌ๊ท€ ๊ณผ์ •์„ ์ •์˜ํ•œ๋‹ค.
    • ๋ฌธ์ œ๋ฅผ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜ํ–ฅ์‹์œผ๋กœ ์ •์˜ : ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ
    • ๊ธฐ๋ณธ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ๋‹ต์„ ์ •์˜
    • ์ข…๋ฃŒ ์กฐ๊ฑด ์ถ”๊ฐ€
  3. (์„ ํƒ์ ) ๋ฉ”๋ชจ ์ „๋žต ์‹œ๋„ : ํ•˜์œ„ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ์บ์‹ฑํ•œ ํ›„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ €์žฅ๋œ ๊ฐ’ ์‚ฌ์šฉ
  4. ์ƒํ–ฅ์‹์œผ๋กœ ๋ฌธ์ œ ํ’€์ด ๋„์ „ : ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ธฐ๋ณธ ์ผ€์ด์Šค์—์„œ ์ถœ๋ฐœํ•˜๋Š” ์ง„ํ–‰ ๋ฐฉํ–ฅ์œผ๋กœ ์žฌ์ •์˜, ํ•„์š”ํ•œ ๊ฐ’๋“ค๋งŒ ์บ์‹ฑ

์˜ˆ์ œ : ํƒ€์ผ๋กœ ๊ณตํ„ฐ ์ฑ„์šฐ๊ธฐ

2 * n ํฌ๊ธฐ์˜ ๊ณตํ„ฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ 2 * 1 ํฌ๊ธฐ์˜ ํƒ€์ผ์„ ๊ฐ€๋กœ ํ˜น์€ ์„ธ๋กœ๋กœ ๋ฐฐ์น˜ํ•˜๋ฉฐ ๋ฎ๊ณ ์ž ํ•  ๋•Œ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜

์žฌ๊ท€ ๊ณผ์ •์„ ์ •์˜ํ•ด๋ณด์ž.

  1. ์ฒซ ๋ฒˆ์งธ ํƒ€์ผ์„ ์„ธ๋กœ๋กœ ๋ฐฐ์น˜ํ•˜์ž. ๊ทธ๋Ÿผ ๋ฌธ์ œ๋Š” 2 * (n-1) ํฌ๊ธฐ ๊ณตํ„ฐ์— ํƒ€์ผ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ์ค„์–ด๋“ ๋‹ค.
  2. ์ฒซ ๋ฒˆ์งธ ํƒ€์ผ์„ ๊ฐ€๋กœ๋กœ ๋ฐฐ์น˜ํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ ํƒ€์ผ๋„ ๋ฐ˜๋“œ์‹œ ๊ฐ€๋กœ๋กœ ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋ฌธ์ œ๋Š” 2* (n-2) ํฌ๊ธฐ ๊ณตํ„ฐ์— ํƒ€์ผ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ์ค„์–ด๋“ ๋‹ค.
def countWays(n) :
    if n == 1 : return 1
    if n == 2 : return 2

    return countWays(n-1) + countWays(n-2)

์˜ˆ์ œ : ํŠน์ • ์ ์ˆ˜์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ํ•œ ๋ฒˆ์— 3์  ๋˜๋Š” 5์  ๋˜๋Š” 10์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋•Œ n์ ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

์ ํ™”์‹

n์ ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
= (n-10)์ ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + (n-5)์ ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + (n-3)์ ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

์žฌ๊ท€๋กœ ํ‘ธ๋Š” ์ฝ”๋“œ

def waysToScore(n):
    if n < 0 : return 0
    if n == 0 : return 1
    return waysToScore(n-10) + waysToScore(n-5) + waysToScore(n-3)
  • ์—ญ์‹œ๋‚˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•จ! ๋น„ํšจ์œจ์ ~

DP๋กœ ํ’€์–ด๋ณด์ž.

def waysToScore(n):
    arr = [0] * n
    arr[0] = 1

    for i in ranger(1, n) :
        if i -3 >= 0 : arr[i] += arr[i-3]
        if i -5 >= 0 : arr[i] += arr[i-5]
        if i -10 >= 0 : arr[i] += arr[i-10]
    return arr[n]

์˜ˆ์ œ : ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ

์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜

์™„์ „ํƒ์ƒ‰์•Œ๊ณ ๋ฆฌ์ฆ˜

def maxSubArraySum(arr, n) :
    maxSum = 0
    tempSum = 0

    for i in range(n):
        tempSum = 0
        for j in range(i,n):
            tempSum += arr[j]
            if (tempSum > maxSum) : maxSum = tempSum
    
    return maxSum
  • ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ ์Œ์ˆ˜์ผ ๋•Œ๋Š” ์˜ค๋‹ต์ธ 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)

์นด๋ฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

def maxSubArraySum(arr, n) :
    maxSumSoFar = 0
    maxSumEndingHere = 0

    for i in range(n):
        maxSumEndingHere += arr[i];
        if maxSumEndingHere < 0 : maxSumEndingHere = 0
        if maxSumEndingHere > maxSumSoFar : 
            maxSumSoFar = maxSumEndingHere

    return maxSumSoFar