{"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":"46cf9599-6ea8-531f-995e-d31bf75117fb","html":"<h1>1629번 : 곱셈</h1>\n<p>👉 <a href=\"https://www.acmicpc.net/problem/1629\">문제 바로가기</a></p>\n<h2>배경 지식</h2>\n<ul>\n<li><code class=\"language-text\">분할 정복(Divide and Conquer)</code> : 그대로 해결할 수 없는 주어진 문제를 <strong>더 이상 문제를 나눌 수 없을 때까지 둘 이상의 작은 부분 문제로 분할하여 문제를 해결</strong>하고, <strong>구해진 문제들을 원 문제로 병합하여 해결</strong>하는 알고리즘</li>\n</ul>\n<h2>푼 방법</h2>\n<p>이 문제를 풀 때 주의해야 할 사항이 2가지가 있다.</p>\n<ol>\n<li><strong>시간 초과 (brute force 알고리즘 사용 시)</strong></li>\n<li><strong>자료형 overflow</strong></li>\n</ol>\n<p>첫번째로, int 자료형의 MAX 범위(2,147,483,647)까지 연산 횟수(B)를 입력 받을 수 있기 때문에 <strong>O(N)의 복잡도</strong>를 갖는 <strong>Brute Force 알고리즘</strong>으로 코드를 작성하면 <strong>TLE(Time Limit Exceeded)</strong> 가 발생한다. 그래서 <strong>Divide and Conquer(분할정복) 알고리즘</strong>을 사용해서 <strong>O(logN)의 시간복잡도</strong>로 연산 횟수를 단축시켜야 통과할 수 있다.</p>\n<p>두번째로, unsigned long long int의 자료형을 사용한다 하더라도 큰 자연수(A)를 받아 몇 번 곱해버리면 <strong>자료형 overflow</strong>가 나기에, 우리는 <strong>연산을 진행할 때마다 mod(modulo) C를 해주어야 overflow없이 결과 값을 얻을 수 있다.</strong></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\">typedef</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">long</span> <span class=\"token keyword\">long</span> ull<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">daq</span><span class=\"token punctuation\">(</span>ull result<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> ull<span class=\"token operator\">&amp;</span> B<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> ull<span class=\"token operator\">&amp;</span> C<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>B <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\t\t<span class=\"token keyword\">return</span> result <span class=\"token operator\">%</span> C<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>B <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// even # of B</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token function\">daq</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>result <span class=\"token operator\">*</span> result<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> C<span class=\"token punctuation\">,</span> B<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> C<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">else</span> <span class=\"token comment\">// odd # of B</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token function\">daq</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>result <span class=\"token operator\">*</span> result<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> C<span class=\"token punctuation\">,</span> B<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> C<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> result<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> C<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\tull A<span class=\"token punctuation\">,</span> B<span class=\"token punctuation\">,</span> C<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> A <span class=\"token operator\">>></span> B <span class=\"token operator\">>></span> C<span class=\"token punctuation\">;</span>\n\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token function\">daq</span><span class=\"token punctuation\">(</span>A <span class=\"token operator\">%</span> C<span class=\"token punctuation\">,</span> B<span class=\"token punctuation\">,</span> C<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\t\n\t<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>","fields":{"tagSlugs":["/tags/백준/","/tags/algorithm/"],"slug":"/posts/baekjoons/1629/"},"frontmatter":{"title":"[백준] 1629 : 곱셈","tags":["백준","Algorithm"],"date":"2020-04-20","description":"백준 1629번 문제 : 곱셈"}}},"pageContext":{"slug":"/posts/baekjoons/1629/"}}