{"data":{"site":{"siteMetadata":{"title":"HOME | blackpudding","subtitle":"고생했어. 오늘도.","copyright":"© All rights reserved.","author":{"name":"William JO","github":"blackpudding96"},"disqusShortname":"blackpudding","url":"https://blackpudding.netlify.com"}},"markdownRemark":{"id":"d694f9d5-8f15-5821-92cc-6d66e708add2","html":"<h1>11051번 : 이항 계수 2</h1>\n<p>👉 <a href=\"https://www.acmicpc.net/problem/11051\">문제 바로가기</a></p>\n<h2>배경 지식</h2>\n<ul>\n<li>\n<p><code class=\"language-text\">이항 계수(Binomial coefficient)</code> : 주어진 크기 집합에서 원하는 개수만큼 <strong>순서없이</strong> 뽑는 조합의 가짓 수</p>\n</li>\n<li>\n<p><code class=\"language-text\">동적계획법(Dynamic Programming)</code> : <strong>복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 알고리즘</strong>; 반복(중복)되는 작은 문제의 결과 값이 항상 같을 때 쓰인다. (분할정복(Divide and Conquer)과의 차이점)</p>\n</li>\n<li>\n<p><code class=\"language-text\">메모이제이션(Memoization)</code> : 동적계획법에서 많이 쓰이는 테크닉으로, <strong>계산된 값을 배열(캐시 : cache)에 저장(캐싱 : caching)한 후 필요한 경우 계산없이 호출</strong>하여 쓰는 방법. (Top-Down DP over recursive function)</p>\n</li>\n<li>\n<p><code class=\"language-text\">파스칼의 삼각형(Pascal&#39;s triangle)</code> : 이항계수를 삼각형 모양의 기하학적 형태로 배열한 구조\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/Pascals_triangle-5efc24f0c5edd190a362237483cd1e0e-f52a0.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 220px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 71.81818181818181%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsSAAALEgHS3X78AAABHElEQVQ4y62Te0sCURDFr+tu2po9xBdSKREUmYKilaVRgQa+PkDfIOj7/90ZOTcOIrJWF37sDDt77txzZ51Ltkag4v5hFcGR5Kcg/RfBO9CWfAEOfyMUgYxQBgdgH+yBeFfBc/Ai+RsYyGYLxqmkgjH9ipib+BUFjEZSMSvqglA87EtnM1Bibs8bxsE20WfprAOGjM27d9rhBQfbhI4lPgEFXogJVdlFnu8rMk7B2mj9eDGX1j/AmPEF+OQmvv4L3IrGbNN8nvEy0hzoshy1BXJS6zs08azYsFpabJdwzbgGHkGPm6T4/gHU5du+NGS4J3Zk656545gswSv9NcEprWixpgkmjC+9DaGcP5aRCWXuvPnB2vz5P8dRI/oGWywPsg023h8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"파스칼의 삼각형\"\n        title=\"\"\n        src=\"/static/Pascals_triangle-5efc24f0c5edd190a362237483cd1e0e-f52a0.png\"\n        srcset=\"/static/Pascals_triangle-5efc24f0c5edd190a362237483cd1e0e-f52a0.png 220w\"\n        sizes=\"(max-width: 220px) 100vw, 220px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n</li>\n</ul>\n<h2>푼 방법</h2>\n<p>백준 10050번(이항 계수 1) 문제의 후속작이다. 10050번 문제의 코드로는 통과할 수 없다. <strong>N의 크기가 10에서 1000으로 증가</strong>했기 때문에 기존 문제 정답의 키였던 <strong>팩토리얼 재귀함수로는 time out</strong>이 될 것이다. (나의 경우 백준에서 런타임 에러가 떴다.)</p>\n<p>왜 time out이 될까? <strong>중복 연산</strong>이 일어나기 때문이다. 그래서 우리는 중복 연산을 피해 <strong>처음 연산된 값을 저장하고, 다시 필요할 때 마다 꺼내 써야한다.(Bottom up DP)</strong></p>\n<p>이번에는 이항 계수의 중요한 성질 중 하나고, 파스칼의 삼각형과 법칙에서 나온 수식을 사용했다.<br>\n<a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/binomial_coefficient-b54528850c7feff40c7bd11568a8d1ae-2079f.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 224px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 23.660714285714285%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsSAAALEgHS3X78AAAAz0lEQVQY0yVQ27KDIAzk///QWlsVudROCZqIFJRzUswDs7ObZDeIEPZto1LKX60YY9j3sxbhSrRdPDcQYsqZ+ZyT9/6bkuj7vuseSMQdLGil27Ylopyz1lpNco+JJTYYnp2cdEw50KomZewsWPDgXtZ4D4g0Slm3lOM8GTgArS0RKqXZ7Qp45er7p2ia2zgO4D2z7DbV4c9s7o+BwXu2C/6SLx6UHJvbndOCA2uMsVYAQwC2um5DxOM4v3x52OvMcrnx65zjH/k5l4K4biH8AxhTHVZRnvzTAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"이항 계수\"\n        title=\"\"\n        src=\"/static/binomial_coefficient-b54528850c7feff40c7bd11568a8d1ae-2079f.png\"\n        srcset=\"/static/binomial_coefficient-b54528850c7feff40c7bd11568a8d1ae-2079f.png 224w\"\n        sizes=\"(max-width: 224px) 100vw, 224px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h2>내 정답 코드 (C++)</h2>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token macro property\">#<span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">bino_coef</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> k<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">int</span> dp<span class=\"token punctuation\">[</span><span class=\"token number\">1001</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1001</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n\t<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\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> n<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span>\n\t\tdp<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><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> <span class=\"token comment\">// 아무것도 고르지 않는 방법은 1가지 (k == 0)</span>\n\t\t\n\t<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\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> n<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span>\n\t\tdp<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 모두 고르는 방법은 1가지 (n == k)</span>\n\n\t<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\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> n<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> k<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>j<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">==</span> j<span class=\"token punctuation\">)</span>\n\t\t\t\t<span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\tdp<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>dp<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 punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> dp<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 punctuation\">[</span>j<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">10007</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">return</span> dp<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>ios<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">sync_with_stdio</span><span class=\"token punctuation\">(</span>false<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cin<span class=\"token punctuation\">.</span><span class=\"token function\">tie</span><span class=\"token punctuation\">(</span><span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> \n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout<span class=\"token punctuation\">.</span><span class=\"token function\">tie</span><span class=\"token punctuation\">(</span><span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">int</span> n<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">;</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cin <span class=\"token operator\">>></span> n <span class=\"token operator\">>></span> k<span class=\"token punctuation\">;</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token function\">bino_coef</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">,</span>k<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>endl<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3>References</h3>\n<p><a href=\"https://new93helloworld.tistory.com/220\">https://new93helloworld.tistory.com/220</a><br>\n<a href=\"https://www.geeksforgeeks.org/tabulation-vs-memoization/\">https://www.geeksforgeeks.org/tabulation-vs-memoization/</a><br>\n<a href=\"https://coding-all.tistory.com/2\">https://coding-all.tistory.com/2</a><br>\n<a href=\"https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%8A%A4%EC%B9%BC%EC%9D%98_%EC%82%BC%EA%B0%81%ED%98%95\">https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%8A%A4%EC%B9%BC%EC%9D%98_%EC%82%BC%EA%B0%81%ED%98%95</a><br>\n<a href=\"https://shoark7.github.io/programming/algorithm/3-ways-to-get-binomial-coefficients\">https://shoark7.github.io/programming/algorithm/3-ways-to-get-binomial-coefficients</a><br>\n<a href=\"https://elvrsn.blogspot.com/2015/02/memoization-vs-tabulation.html\">https://elvrsn.blogspot.com/2015/02/memoization-vs-tabulation.html</a></p>","fields":{"tagSlugs":["/tags/백준/","/tags/algorithm/"],"slug":"/posts/baekjoons/11051/"},"frontmatter":{"title":"[백준] 11051 : 이항 계수 2","tags":["백준","Algorithm"],"date":"2020-03-20","description":"백준 11051번 문제 : 이항 계수 2"}}},"pageContext":{"slug":"/posts/baekjoons/11051/"}}