2. 분할정복


분할정복(Divide & Conquer) 은 말그대로 분할하여 정복 하는 문제해결 방법론입니다.

문제를 풀기 쉬운 작은 문제로 나누고, 해결한 작은 문제를 합쳐가며 문제를 해결하는 방법입니다. 예시를 살펴보며 감을 익혀봅시다.

분할 정복 예시

큰 수 곱셈

큰 수를 곱셈도 분할 정복을 사용하면 쉽게 할 수 있습니다.

a, b, c = map(int, input().split())

def pow2(a, b, c):
    if b == 0 : return 1
    return (a if b%2==1 else 1 )* pow2(a, b//2, c)**2%c

print(pow2(a, b, c))

하노이탑

하노이의 탑

하노이탑은 다음과 같은 규칙을 가지고 있는 퍼즐입니다.

세 개의 기둥과 이 기둥에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있다.

게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것이다.

1. 한 번에 하나의 원판만 옮길 수 있다.
2. 큰 원판이 작은 원판 위에 있어서는 안 된다.
def f(s,e,z):
    if z<2: print(s,e)
    else:f(s,6-s-e,z-1),print(s,e),f(6-s-e,e,z-1)

n = int(input())
print(2**n-1)
f(1,3,n)