{"componentChunkName":"component---src-templates-blog-post-js","path":"/programming/2016-04-26-Dynamic-Programming/","result":{"data":{"site":{"siteMetadata":{"title":"Seungdols Company","author":"[Seungdols]","siteUrl":"https://seungdols.dev","comment":{"disqusShortName":"","utterances":"seungdols/seungdols.dev"},"sponsor":{"buyMeACoffeeId":"seungdols"}}},"markdownRemark":{"id":"510e87cb-b901-5d00-ab4b-5d183b534488","excerpt":"Dynamic Programming 여기서 사용되는 Dynamic은 의미 없는 말이다.\n또한, 동적 계획법이라고 표현해야 옳은 표현이라고 할 수 있다. 동적 계획법은 2가지의 속성을 만족해야 한다. Overlapping subproblem optimal substructure 첫 번째 속성은 겹쳐지는 부분 문제이다. 예시로 표현하면, 피보나치 수열을 구하는 것으로 설명 할 수 있다.\n피보나치 수는 첫째 항과 두번 째 항을 구하며 다음 항을 구한다. 즉, 바꿔서 생각하면 N항은 N-1항 + N-…","html":"<h3 id=\"dynamic-programming\" style=\"position:relative;\"><a href=\"#dynamic-programming\" aria-label=\"dynamic programming permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dynamic Programming</h3>\n<p>여기서 사용되는 Dynamic은 의미 없는 말이다.\n또한, 동적 계획법이라고 표현해야 옳은 표현이라고 할 수 있다.</p>\n<p>동적 계획법은 2가지의 속성을 만족해야 한다.</p>\n<ol>\n<li>Overlapping subproblem</li>\n<li>optimal substructure</li>\n</ol>\n<p>첫 번째 속성은 겹쳐지는 부분 문제이다.</p>\n<p>예시로 표현하면, 피보나치 수열을 구하는 것으로 설명 할 수 있다.\n피보나치 수는 첫째 항과 두번 째 항을 구하며 다음 항을 구한다.</p>\n<p>즉, 바꿔서 생각하면 N항은 N-1항 + N-2항의 합으로 구해진다.</p>\n<p>세번째 항은 두번 째항, 첫 번째항의 합으로 구해진다.\n네번째 항은 세번째 항, 두번째 항의 합으로 구해진다.</p>\n<p>여기서 겹치는 부분 문제가 발생한다. 바로, 두 번째 항이 겹치며, 다섯 번째 항에서는 세번 째항이 겹치게 된다.</p>\n<p>최적 부분 구조라는 것은 문제의 정답을 작은 문제의 정답에서 구할 수 있다는 것이다.</p>\n<p>예로, 서울 - 대전 - 대구 - 부산으로 가는 길이 가장 빠르다면,\n대전에서 부산을 가는 가장 빠른 길은 대구를 거쳐야 한다는 것이다.</p>\n<p>Optimal substructure를 만족하면, 문제의 크기와는 상관 없이 어떤 한 문제의 정답은 일정하다.</p>\n<p>왜냐면, Overlapping subproblem에 의해서 이미 전에 구한 값을 계속 구하기 때문이다.</p>\n<p>Fibonacci(3) = Fibonacci(2) + Fibonacci(1)</p>\n<p>Fibonacci(4) = Fibonacci(3) + Fibonacci(2)</p>\n<p>Fibonacci(5) = Fibonacci(4) + Fibonacci(3)</p>\n<p>즉, 5번째를 구한다 쳐도 결국 2번째 피보나치 수도 계산한다.</p>\n<p>고로, 4번째 피보나치 수를 구하든, 5번째 피보나치 수를 구하든 2번째 항의 피보나치 수는 계속 일정하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"stdio.h\"</span></span>\n\n<span class=\"token keyword\">int</span> memo<span class=\"token punctuation\">[</span><span class=\"token number\">100</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">int</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> n<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">else</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>memo<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">return</span> memo<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        memo<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> memo<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위 코드의 경우에는 memo라는 배열에 적으면서 DP를 진행한다. 그래서 다이나믹 프로그래밍은 보통 Memoization을 한다고 표현한다.\n메모한다라는 뜻을 가졌다.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">int</span> <span class=\"token function\">fibonacci_topDown</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> n<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">else</span>\n    <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위 코드의 경우 Top-Dwon방식으로 해답을 구하는데, 보통 재귀 호출을 통해서 답을 구한다.</p>\n<p>큰 문제에서 부터 작은 문제로 뻗어 나가는 형식이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">int</span> d<span class=\"token punctuation\">[</span><span class=\"token number\">100</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">int</span> <span class=\"token function\">fibonacci_bottomUp</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    d<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    d<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">2</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;=</span>n<span class=\"token punctuation\">;</span>i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        d<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> d<span class=\"token punctuation\">[</span>i<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> d<span class=\"token punctuation\">[</span>i<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> d<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위 코드는 Bottom-Up방식으로 문제를 해결한다.\n고로, 작은 문제를 풀면서 큰 문제를 풀어간다.</p>\n<h4 id=\"큰-문제는-작은-부분-문제의-합과-같기에-작은-문제가-풀리면-큰-문제도-풀린다\" style=\"position:relative;\"><a href=\"#%ED%81%B0-%EB%AC%B8%EC%A0%9C%EB%8A%94-%EC%9E%91%EC%9D%80-%EB%B6%80%EB%B6%84-%EB%AC%B8%EC%A0%9C%EC%9D%98-%ED%95%A9%EA%B3%BC-%EA%B0%99%EA%B8%B0%EC%97%90-%EC%9E%91%EC%9D%80-%EB%AC%B8%EC%A0%9C%EA%B0%80-%ED%92%80%EB%A6%AC%EB%A9%B4-%ED%81%B0-%EB%AC%B8%EC%A0%9C%EB%8F%84-%ED%92%80%EB%A6%B0%EB%8B%A4\" aria-label=\"큰 문제는 작은 부분 문제의 합과 같기에 작은 문제가 풀리면 큰 문제도 풀린다 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>큰 문제는 작은 부분 문제의 합과 같기에 작은 문제가 풀리면 큰 문제도 풀린다.</h4>","frontmatter":{"title":"Dynamic Programming","date":"April 26, 2016"}}},"pageContext":{"slug":"/programming/2016-04-26-Dynamic-Programming/","previous":null,"next":{"fields":{"slug":"/java/2016-04-27-BigInteger-Java/"},"frontmatter":{"title":"Use BigInteger of Java "}}}}}