CK week3 day3

BnDCΒ·2021λ…„ 10μ›” 8일
0

code Kata

λͺ©λ‘ 보기
13/22

🧨 문제

μ–‘μˆ˜λ‘œ 이루어진 m x n κ·Έλ¦¬λ“œκ°€ 인자둜 λ“€μ–΄ μ˜¨λ‹€.
상단 μ™Όμͺ½μ—μ„œ μ‹œμž‘ν•˜μ—¬,
ν•˜λ‹¨ 였λ₯Έμͺ½κΉŒμ§€ κ°€λŠ” 길의 μš”μ†Œλ₯Ό λ‹€ λ”ν–ˆμ„ λ•Œ,
κ°€μž₯ μž‘μ€ 합을 μ°Ύμ•„μ„œ return ν•˜λΌ.

ν•œ μ§€μ μ—μ„œ μš°μΈ‘μ΄λ‚˜ μ•„λž˜λ‘œλ§Œ 이동할 수 μžˆλ‹€.


Input: [ [1,3,1],   
	 [1,5,1],    
         [4,2,1] 
       ]
Output: 7

1β†’3β†’1β†’1β†’1 으둜 μš”μ†Œμ˜ 합이 κ°€μž₯ μž‘μŒ






🏹 λ°œμƒ


(0, 0) μ—μ„œ (1, 1) 으둜 κ°€λŠ” μ΅œμ†Œ κ²½λ‘œλŠ”
(0, 1) λ°©ν–₯κ³Ό (1, 0) λ°©ν–₯ 쀑
μž‘μ€ μͺ½μ„ 택해 λ”ν•˜λŠ” 경우 이닀.

(0, 1)μ—μ„œ (1, 2)둜 κ°€λŠ” μ΅œμ†Œ κ²½λ‘œλŠ” (0, 2)와 (1, 1)을 거쳐 μ˜€λŠ” 경우 쀑 μ΅œμ†Œ 경둜λ₯Ό νƒν•˜λŠ” κ²½μš°μ΄λ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ
(1, 0)μ—μ„œ (2, 1)둜 κ°€λŠ” μ΅œμ†Œ κ²½λ‘œλŠ” (1, 1)와 (2, 0)을 거쳐 μ˜€λŠ” 경우 쀑 μ΅œμ†Œ 경둜λ₯Ό νƒν•˜λŠ” κ²½μš°μ΄λ‹€.

κ³„μ†ν•΄μ„œ
(1, 1)μ—μ„œ (3, 2)둜 κ°€λŠ” μ΅œμ†Œ κ²½λ‘œλŠ” (2, 1)와 (1,2) λ₯Ό 거쳐 μ˜€λŠ” 경우 쀑 μ΅œμ†Œ 경둜λ₯Ό νƒν•˜λŠ” κ²½μš°μ΄λ‹€.

이런 λ°©μ‹μœΌλ‘œ (0, 0)μ—μ„œ (x, y)κΉŒμ§€μ˜ μ΅œμ†Œ 경둜λ₯Ό λˆ„μ ν•΄ λ”ν•˜λ©΄ μ΅œμ†Œ 경둜λ₯Ό ꡬ할 수 μžˆλ‹€.


μž¬κ·€ ν•¨μˆ˜, λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•΄ ν’€μ–΄ λ³΄μ•˜λŠ”λ°, 풀이 λ°©λ²•μ˜ μ°¨μ΄λŠ” μžˆμ§€λ§Œ, μ•„μ΄λ””μ–΄λŠ” 동일 ν•˜λ‹€






🎯 λ‚΄ 풀이

(μž¬κ·€ ν•¨μˆ˜ ν™œμš©)

def min_path_sum(grid):
   #step1
    first_columns = [element[0] for element in grid]
    
   #step2
    def sum_path(x, y):
        if x == 0 and y == 0:
            return grid[x][y]
        elif x == 0 and y > 0:
            return sum(grid[x][:y+1])
        elif x > 0 and y == 0:
            return sum(first_columns[:x+1]) 
        return min(sum_path(x-1, y), sum_path(x, y-1)) + grid[x][y]
    
    #step3      
    return sum_path(len(grid)-1, len(grid[0])-1)



πŸ“ step1

첫번째 열을 λˆ„μ ν•΄μ„œ λ”ν•˜κΈ° μˆ˜μ›”ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ,
grid λ₯Ό 첫 μ—΄μ˜ μ›μ†Œλ“€μ„ 담을 리슀트λ₯Ό first_columns 에 λ‹΄λŠ”λ‹€.



πŸ“ step2

μ΅œμ†Œκ°’μ„ κ΅¬ν•˜λŠ” ν•¨μˆ˜ sum_pathλ₯Ό μ„ μ–Έ ν•œλ‹€.
sum_path ν•¨μˆ˜λŠ” 쀑첩 λ¦¬μŠ€νŠΈμ—μ„œ
λ‚΄λΆ€ 리슀트의 ν•œ μ›μ†Œμ˜ 인덱슀λ₯Ό x,
μ™ΈλΆ€ 리슀트의 인덱슀λ₯Ό y둜 ν•˜μ—¬

(0,0)μ—μ„œ (x,y)둜 올 λ•Œ κΉŒμ§€μ˜
μ΅œμ†Œ 경둜λ₯Ό μž¬κ·€μ μΈ λ°©λ²•μœΌλ‘œ κ΅¬ν•˜λŠ” μž¬κ·€ ν•¨μˆ˜λ‹€.




πŸ“ step3

μ™ΈλΆ€ ν•¨μˆ˜μ—μ„œ sum_path(x, y)λ₯Ό ν˜ΈμΆœν•˜κ³  λ°˜ν™˜ ν•œλ‹€.






🎯 λ‚΄ 풀이

(λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°)

import time

start = time.time()

def min_path_sum(grid):
#step1
    result = [[0] * len(grid[0]) for i in range(len(grid))]
    first_columns = [grid[i][0] for i in range(len(grid))]

#step2
    for i in range(len(result[0])):
        result[0][i] = sum(grid[0][:i+1])

    for i in range(len(first_columns)):
        result[i][0] = sum(first_columns[:i+1])

#step3
    for i in range(1, len(grid)):
        for j in range(1, len(grid[0])):
            result[i][j] = min(result[i-1][j], result[i][j-1]) + grid[i][j]

    print(result)
    print(grid)

    return result[len(grid) - 1][len(grid[0])-1]


print(min_path_sum([[1, 3, 1], [1, 5, 1], [4, 2, 1]]))
print(min_path_sum([[1, 4, 5, 2], [3, 1, 2, 3]]))

end = time.time()

print(f"{end - start:.5f} sec")



πŸ“ step1

경둜의 μ΅œμ†Œκ°’μ„ 담을 리슀트 result와
grid의 첫 열을 μˆ˜μ›”ν•˜κ²Œ λ”ν•˜κΈ° μœ„ν•΄,
first_columns에 grid 의 μ²«μ—΄μ˜
μ›μ†Œλ§Œ μ›μ†Œλ‘œ λ‹΄λŠ”λ‹€.



πŸ“ step2

κ°€μž₯ λ°”κΉ₯ μͺ½μœΌλ‘œ μ΄λ™ν•˜λŠ” 경우λ₯Ό κ³ λ €ν•˜κΈ° μœ„ν•΄
κ°€μž₯ λ°”κΉ₯ μͺ½ ν–‰, μ—΄ λ°©ν–₯만으둜 μ΄λ™ν•˜λ©° λˆ„μ ν•˜μ—¬ result에 λ‹΄λŠ”λ‹€.



πŸ“ step3

result에 (1,1), (1,2) ... (2,0),(2,1), ... (x, y-1), (x-1, y)κΉŒμ§€μ˜ μ΅œμ†Œκ°’λ“€μ„ λ‹΄μœΌλ©°, μ΅œμ’…μ μœΌλ‘œ (x, y)의 값을 κ΅¬ν•˜κ³ , λ°˜ν™˜ν•œλ‹€.

profile
β€œLife is C (Choice) between B (Birth) and D (Death).” - 인생은 B와 Dμ‚¬μ΄μ˜ C

0개의 λŒ“κΈ€