{"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":"afecbb83-03ff-5957-9454-1b937e0331fd","html":"<h1>2981번 : 검문</h1>\n<p>👉 <a href=\"https://www.acmicpc.net/problem/2981\">문제 바로가기</a></p>\n<h2>배경 지식</h2>\n<ul>\n<li><code class=\"language-text\">약수</code> : 어떤 정수를 나누어 떨어지게 하는 수</li>\n<li><code class=\"language-text\">공약수</code> : 두 수, 혹은 그 이상의 여러 수의 공통인 약수</li>\n<li><code class=\"language-text\">최대공약수</code> : 공약수 중 가장 큰 수</li>\n</ul>\n<h2>푼 방법</h2>\n<p>정답 비율이 21%로 꽤 어려운(?) 문제라고 볼 수 있다. 하지만, 정답 비율에 겁먹으면 초장부터 50%는 지고 들어가는 것이다. 자신감을 갖자.</p>\n<p>수학적 사고 능력이 필요한 문제이다. 주어진 숫자 <strong>num</strong>이 오름차순이라 가정하고 나누는 숫자는 <strong>M</strong>, 나머지는 <strong>R</strong>일때 다음과 같이 표현할 수 있다.</p>\n<p>num[0] = K[0] x M + R<br>\nnum[1] = K[1] x M + R<br>\nnum[2] = K[2] x M + R<br>\nㅤㅤㅤㅤㅤ፧</p>\n<p>여기서 걸리적거리는 나머지를 없애보자. 나머지 R을 없애려면 <strong>num[i]에서 num[i-1]을 빼주면 된다.</strong></p>\n<p>num[1] - num[0] = M x (K[1] - K[0])<br>\nnum[2] - num[1] = M x (K[2] - K[1])<br>\nㅤㅤㅤㅤㅤㅤㅤㅤ፧</p>\n<p>위 수식에서 중요한 포인트는, <strong>나누는 수 M은 num[i] - num[i-1]의 약수라는 것</strong>이다. 그러므로, <strong>num[i] - num[i-1]들의 최대공약수를 구한 후 그 약수들을 구하면 나머지가 모두 같게 되는 모든 M을 찾을 수 있다.</strong></p>\n<hr>\n<p>&#x3C;본문제 풀이></p>\n<p>6 = K[0] x M + R<br>\n34 = K[1] x M + R<br>\n38 = K[2] x M + R</p>\n<p>34 - 4 = M x (K[1] - K[0]) = 28<br>\n38 - 34 = M x (K[2] - K[1]) = 4  </p>\n<p>28과 4의 최대공약수 : 4</p>\n<p>4의 약수 = 2, 4 (1은 문제 제약조건 상 제외)</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<span class=\"token macro property\">#<span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;algorithm></span></span>\n<span class=\"token macro property\">#<span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;vector></span></span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">get_gcd</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> a<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> b<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> b <span class=\"token operator\">?</span> <span class=\"token function\">get_gcd</span><span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">,</span> a<span class=\"token operator\">%</span>b<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">:</span> a<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> gcd_num <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> temp_num<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 punctuation\">;</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> num<span class=\"token punctuation\">;</span>\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> factor<span class=\"token punctuation\">;</span>\n\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\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 숫자 입력 받기</span>\n\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cin <span class=\"token operator\">>></span> temp_num<span class=\"token punctuation\">;</span>\n\t\t\n\t\tnum<span class=\"token punctuation\">.</span><span class=\"token function\">emplace_back</span><span class=\"token punctuation\">(</span>temp_num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">.</span><span class=\"token function\">begin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">.</span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 오름차순 정렬</span>\n\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 punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token comment\">// num[i] - num[i-1]의 최대공약수 구하기</span>\n\t\tgcd_num <span class=\"token operator\">=</span> <span class=\"token function\">get_gcd</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> num<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> gcd_num<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\">*</span>i <span class=\"token operator\">&lt;=</span> gcd_num<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 최대공약수의 약수구하기</span>\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>gcd_num <span class=\"token operator\">%</span> i <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\tfactor<span class=\"token punctuation\">.</span><span class=\"token function\">emplace_back</span><span class=\"token punctuation\">(</span>i<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>gcd_num <span class=\"token operator\">/</span> i <span class=\"token operator\">==</span> i<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<span class=\"token keyword\">else</span>\n\t\t\t\tfactor<span class=\"token punctuation\">.</span><span class=\"token function\">emplace_back</span><span class=\"token punctuation\">(</span>gcd_num<span class=\"token operator\">/</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span>factor<span class=\"token punctuation\">.</span><span class=\"token function\">begin</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> factor<span class=\"token punctuation\">.</span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 오름차순 정렬</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>iterator iter <span class=\"token operator\">=</span> factor<span class=\"token punctuation\">.</span><span class=\"token function\">begin</span><span class=\"token punctuation\">(</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' 제외</span>\n\t\n\t<span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> iter <span class=\"token operator\">!=</span> factor<span class=\"token punctuation\">.</span><span class=\"token function\">end</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>iter<span class=\"token punctuation\">)</span>\n\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token operator\">*</span>iter <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\" \"</span><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://namu.wiki/w/%EC%B5%9C%EB%8C%80%EA%B3%B5%EC%95%BD%EC%88%98\">https://namu.wiki/w/%EC%B5%9C%EB%8C%80%EA%B3%B5%EC%95%BD%EC%88%98</a></p>","fields":{"tagSlugs":["/tags/백준/","/tags/algorithm/"],"slug":"/posts/baekjoons/2981/"},"frontmatter":{"title":"[백준] 2981 : 검문","tags":["백준","Algorithm"],"date":"2020-03-16","description":"백준 2981번 문제 : 검문"}}},"pageContext":{"slug":"/posts/baekjoons/2981/"}}