분할정복(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)