Algorithm/백준

[Python][백준] 백준 1463번 1로 만들기 풀이 | DP와 Divide and conquer

이무기뱀술 2022. 2. 25. 19:51
728x90

DP(Dynamic Programming)

큰 문제를 작은 문제로 나누어 푸는 알고리즘이다.

Divide and conquer와는 다르다!

Divide and conquer는 큰 문제를 작은 단위로 나누어 해결한 다음 합치는 알고리즘이다. (예시 merge sort)

 

오늘은 DP를 이용하여 푸는 백준 1463번의 코드를 공유하겠다.

# DP를 이용한 풀이
n = int(input())
dp = [0] * max(4, n+1)
dp[2], dp[3] = 1, 1
for i in range(4, n+1):
    temp1 = dp[i//3] if i % 3 == 0 else float("inf")
    temp2 = dp[i//2] if i % 2 == 0 else float("inf")
    
    dp[i] = min(temp1, temp2, dp[i-1]) + 1

print(dp[n])

 

 

 

앞으로 DP 문제 많이 풀 예정.

 


원래 이 문제를 풀때 다른 방법으로 시도하려 했다.

# 인수분해 트리 만들기

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.center = None  # 2 나누기
        self.right = None  # 1 빼기

    def __str__(self):
        return str(self.data)


class Tree:
    def __init__(self):
        self.root = None

    def makeRoot(self, node, left_node, center_node, right_node):
        if self.root is None:
            self.root = node
        node.left = left_node
        node.center = center_node
        node.right = right_node

    def getHeight(self, root):
        if root is None:
            return -1
        left_height = self.getHeight(root.left) + 1
        center_height = self.getHeight(root.center) + 1
        right_height = self.getHeight(root.right) + 1

        return max(left_height, center_height, right_height)

    def find1(self):


def P1463():
    num = int(input())
    n = Node(num)
    t = Tree()
    while True:
        temp = num
        if temp == 1:
            return
        if num % 3 == 0:
            left = Node(num / 3)
        else:
            left = None

        if num % 2 == 0:
            center = Node(num / 2)
        else:
            center = None
        right = Node(num-1)

        t.makeRoot(n, left, center, right)

if __name__ == '__main__':
    P1463()

한 눈에 봐도 복잡하지 않은가? 트리 구조를 이용하여 모든 경우의 수를 찾으려고 했다. 그러나, 이 알고리즘은 완성하지도 못했을 뿐더러, 만약에 코드를 구현한다 해도, 시간초과되었을 것이다.

728x90