/ ALGORITHM

Algorithm 동적 계획법에 관하여

동적 계획법

동적 계획법이란, 보다 큰 문제를 작은 문제로 나누어 푸는 방식을 뜻한다. 이 부분은 분할과 정복과 유사한데, 분할과 정복은 중복이 절대 일어날 수 없다 는 것이고, 동적 계획법에서는 문제가 중복된다는 점이다. 이 부분에서 동적 계획법은 중복으로 일어난 작은 문제에 대하여 그 문제에 사용되었던 방식을, 값을 캐시(cache)라 불리는 메모리에 미리 넣어두고 중복되는 문제를 마주칠 시에 미리 저장되어 있던 값을 꺼내어 사용하는 것이다.(Memoization 메모이제이션) ex_screenshot 위의 사진에서 보이는 대로 f(3)의 f(2)의 검은색 부분이 겹치기 때문에, 이 값들은 캐시에 저장해두고 쓸 수 있다. 미리 값을 정해두고 계산을 하는 것이기 때문에 시간이 단축된다.

동적 계획법 조건

동적 계획법은 2가지 조건을 만족하여야 동적 계획법으로 문제를 풀 수 있다. 첫 번째는, 겹치는 부분이 있어야하고(overlapping subproblem), 최적의 부분 구조가 있어야 한다. 1. Overlapping Subproblem
보통은 피보나치 수열을 예로들어, 이 부분을 설명할 수 있다. 피보나치 수열의 경우, Fn = F(n-1)+F(n-2)의 즉, 앞의 두수를 더하면 다음 수가 되는 것이다. 이럴 경우, 재귀함수로 표현할 시 return 값이 f(n-1)+f(n-2)로 본인의 메소드를 다시 불러오게 된다.(n=인자값) 앞의 두수는 이미 앞에서 계산할 때 계산이 된 수이므로, 다시 계산할 필요없이 cache에 담아두고 빠르게 찾아쓰자는 것이다. 이렇게 겹치는 부분이 우선 존재해야 한다.

2. Optimal Substructure
최적 부분 구조는 어떤 문제의 최적의 해결책이 그 부분 문제의 최적의 해결책으로 부터 설계될 수 있다는 것을 가르킨다. 피보나치를 예로 들자면 100번째 항은 항상 99과 98의 합과 같다. 또한, 각각 99와 98은 98과97의 합 97과 96의 합과 같다. 이렇듯, 부분의 문제의 해결책이 보다 큰 문제의 해결책이 되는 경우가 이에 해당한다.

동적 계획법 구현 방식

1. Top-down
말그대로 위에서 부터 아래로, 큰 문제(Fn)를 작은 문제(F(n-1)+F(n-2)로 나누어 작은 문제부터 풀고 큰 문제를 푸는 것을 가르킨다. 피보나치 수열을 계산할 떄 재귀함수로 푸는 것이 이에 해당한다.

2. Bottom-up
탑 다운과 반대로 문제 크기가 작은 것부터 큰것으로 푼다. 작은 것부터 차례대로 풀었기 때문에 큰 문제를 당연히 풀 수 있으며, 반복하면 가장 큰 문제를 풀 수 있게 된다. 보통 피보나치 수열에선 for문을 사용하여 i가 2부터 n까지(0과 1은 정해져 있음) 작은 문제부터 풀어 나가게 된다.