π programmers μ«μ νμ λν level3
μ΄ λ¬Έμ λ νΌ μ¬λμ΄ 100λͺ λ―Έλ§μΈ λ°λ λ°κ·Όν λ¬Έμ μ΄λ€
μ²μμ μ΄λ»κ² μ κ·Όν΄μΌν μ§ κ°μ΄ μμ‘νμ§λ§ μΌλ¨! νμ΄λ³Έ λ¬Έμ μ΄λ€.
- 첫 νμ΄
import sys sys.setrecursionlimit(10**9) def solution(numbers): left, right = 4, 6 depth = [ [1, 7, 6, 7, 5, 4, 5, 3, 2, 3], # 0 [7, 1, 2, 4, 2, 3, 5, 4, 5, 6], # 1 [6, 2, 1, 2, 3, 2, 3, 5, 4, 5], # 2 [7, 4, 2, 1, 5, 3, 2, 6, 5, 4], # 3 [5, 2, 3, 5, 1, 2, 4, 2, 3, 5], # 4 [4, 3, 2, 3, 2, 1, 2, 3, 2, 3], # 5 [5, 5, 3, 2, 4, 2, 1, 5, 3, 2], # 6 [3, 4, 5, 6, 2, 3, 5, 1, 2, 4], # 7 [2, 5, 4, 5, 3, 2, 3, 2, 1, 2], # 8 [3, 6, 5, 4, 5, 3, 2, 4, 2, 1]] # 9 result = [] def dfs(number_po, total_val, left, right): # number_po μ μμΉκ° numbers μ λκΉμ§ κ°μΌλ©΄ μ’ λ£ if number_po > len(numbers) - 1: result.append(total_val) return change_num = int(numbers[number_po]) # λ°κΆμΌν λ²νΈ left_val = depth[left][change_num] right_val = depth[right][change_num] # μΌμͺ½κ³Ό μ€λ₯Έμͺ½μ λ€μ κ°μ€μΉ if left_val < right_val: total_val += left_val dfs(number_po + 1, total_val, change_num, right) elif right_val < left_val: total_val += right_val dfs(number_po + 1, total_val, left, change_num) elif left_val == right_val: total_val += left_val dfs(number_po + 1, total_val, change_num, right) dfs(number_po + 1, total_val, left, change_num)
μ€κ°μ μ€ν¨κ° λ¨κ³ λ§μ§λ§ 5κ°κ° μκ° μ΄κ³Όκ° λλ€.
μκ° μ΄κ³Όκ° λ¬λ€λ κ²μ... μ΄μ§κ°νλ©΄ μ κ·Ό λ°©μμ΄ μ΄κ² μλλΌλ건λ°... μΌλ¨ λ¬Έμ λ₯Ό λ€μ μ½κ³ νμ΄λ³΄μλ€.
κ·Έ λ μ μμ μλ λ²νΈλ 무쑰건 λλ¬μΌ νλ€ ν΄μ κ·Έ λλ‘ μ½λμ λ£μ΄λ΄€λ€.
첫 λ²μ§Έ μ½λλ μκΈ° μ μμ μλ λ²νΈλ₯Ό λλ₯Όν λ° λΌλ μλ¬Έμ κ°μ§λ©°...
- λ λ²μ§Έ νμ΄
import sys sys.setrecursionlimit(10**9) def solution(numbers): left, right = 4, 6 depth = [ [1, 7, 6, 7, 5, 4, 5, 3, 2, 3], # 0 [7, 1, 2, 4, 2, 3, 5, 4, 5, 6], # 1 [6, 2, 1, 2, 3, 2, 3, 5, 4, 5], # 2 [7, 4, 2, 1, 5, 3, 2, 6, 5, 4], # 3 [5, 2, 3, 5, 1, 2, 4, 2, 3, 5], # 4 [4, 3, 2, 3, 2, 1, 2, 3, 2, 3], # 5 [5, 5, 3, 2, 4, 2, 1, 5, 3, 2], # 6 [3, 4, 5, 6, 2, 3, 5, 1, 2, 4], # 7 [2, 5, 4, 5, 3, 2, 3, 2, 1, 2], # 8 [3, 6, 5, 4, 5, 3, 2, 4, 2, 1]] # 9 result = [] def dfs(number_po, total_val, left, right): # number_po μ μμΉκ° numbers μ λκΉμ§ κ°μΌλ©΄ μ’ λ£ if number_po > len(numbers) - 1: result.append(total_val) return change_num = int(numbers[number_po]) # μμ§μ¬μΌν λ€μ λ²νΈ left_val = depth[left][change_num] right_val = depth[right][change_num] # μΌμͺ½κ³Ό μ€λ₯Έμͺ½μ λ€μ κ°μ€μΉ if left_val == 1: dfs(number_po + 1, total_val + left_val, change_num, right) elif right_val == 1: dfs(number_po + 1, total_val + right_val, left, change_num) # κ°μ€μΉκ° 1μΌλλ ν΄λΉ λ²νΈ μμ μκ°λ½μ΄ μλ€λ κ²μ΄λκΉ κ·Έλλ‘ λλ¬μΌν¨ else: dfs(number_po + 1, total_val + left_val, change_num, right) dfs(number_po + 1, total_val + right_val, left, change_num) return # dfs -> λ§€κ°λ³μ : νμ¬ numbersμ μμΉ, μ§κΈκΉμ§μ κ°μ€μΉ, left, right μκ°λ½ μμΉ!
μμ λ¬Έμ μ λ΅μ΄ μμλ€.
νμ§λ§ μκ° μ΄κ³Όλ μμ... dfs λ‘ νκΈ°λ νμ§λ§ λ€λ₯Έ νμ΄λ‘λ μΌμ μ€λ₯Έμͺ½μ λλμ΄μ dpλ‘ κΈ°λ‘νλ©° λμκ°λ©΄ μκ°μ μ€μΌ μ μμ κ² κ°λ€.
λ΄μΌ λ€μ νμ΄λ΄μΌκ² λ€.
μ€λ λ!