{"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":"09d215b2-637e-52d9-9868-1e413103c996","html":"<h1>2630번 : 색종이 만들기</h1>\n<p>👉 <a href=\"https://www.acmicpc.net/problem/2630\">문제 바로가기</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<p> 분할 정복 알고리즘은 <strong>보통 재귀함수(recursive function)을 이용해서 구현하는 것이 일반적</strong>이나 <strong>빠른 실행, 부분 문제 해결 순서 선택 등</strong>을 위해 재귀호출을 사용하지 않고 <strong>스택(stack), 큐(queue) 등의 자료구조를 이용하여 구현</strong>하기도 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> 1. 분할 (Divide) : 해결할 문제를 여러 개의 부분 문제로 나눈다.\n 2. 정복 (Conquer) : 나누어진 부분 문제를 각각 해결한다.\n 3. 통합 (Combine) : 해결된 해답을 모은다 (필요할 경우)</code></pre></div>\n<h2>푼 방법</h2>\n<p>기본적인 분할 정복(divide and conquer) 문제이다. <strong>4개의 부분 문제</strong>로 분할, 정복해나가기 때문에 ’<strong>쿼드트리</strong>‘라고도 불린다.</p>\n<p>색종이 배열을 입력받고, 분할 정복 재귀 함수를 구현한다. <strong>분할한 문제에서 white(0) 이나 blue(1) 로만 이루어져 있지 않을 경우 계속 분할</strong>한다; <strong>더 이상 나누어 질 수 없을 때까지 계속 진행하여(= size : 1)</strong> white(0) 개수와 blue(1) 개수를 구해나가고, 최종적으로 white(0) 개수와 blue(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\n<span class=\"token keyword\">int</span> colored_paper<span class=\"token punctuation\">[</span><span class=\"token number\">128</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">128</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> w_cnt<span class=\"token punctuation\">,</span> b_cnt<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">divide_and_conquer</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">int</span><span class=\"token operator\">&amp;</span> row_idx<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">int</span><span class=\"token operator\">&amp;</span> col_idx<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">int</span><span class=\"token operator\">&amp;</span> size<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">int</span> element <span class=\"token operator\">=</span> colored_paper<span class=\"token punctuation\">[</span>row_idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>col_idx<span class=\"token punctuation\">]</span><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> r <span class=\"token operator\">=</span> row_idx<span class=\"token punctuation\">;</span> r <span class=\"token operator\">&lt;</span> size <span class=\"token operator\">+</span> row_idx<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>r<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> c <span class=\"token operator\">=</span> col_idx<span class=\"token punctuation\">;</span> c <span class=\"token operator\">&lt;</span> size <span class=\"token operator\">+</span> col_idx<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>c<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>colored_paper<span class=\"token punctuation\">[</span>r<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>c<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> element<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token function\">divide_and_conquer</span><span class=\"token punctuation\">(</span>row_idx<span class=\"token punctuation\">,</span> col_idx <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>            <span class=\"token comment\">// 1사분면</span>\n\t\t\t\t<span class=\"token function\">divide_and_conquer</span><span class=\"token punctuation\">(</span>row_idx<span class=\"token punctuation\">,</span> col_idx<span class=\"token punctuation\">,</span> size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>                       <span class=\"token comment\">// 2사분면</span>\n\t\t\t\t<span class=\"token function\">divide_and_conquer</span><span class=\"token punctuation\">(</span>row_idx <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> col_idx<span class=\"token punctuation\">,</span> size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>            <span class=\"token comment\">// 3사분면</span>\n\t\t\t\t<span class=\"token function\">divide_and_conquer</span><span class=\"token punctuation\">(</span>row_idx <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> col_idx <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> size<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 4사분면</span>\n\t\t\t\t<span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\telement <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token operator\">?</span> <span class=\"token operator\">++</span>b_cnt <span class=\"token punctuation\">:</span> <span class=\"token operator\">++</span>w_cnt<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 comment\">// white : 0, blue : 1</span>\n\t<span class=\"token keyword\">int</span> n<span class=\"token punctuation\">;</span>\n\tw_cnt <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> b_cnt <span class=\"token operator\">=</span> <span class=\"token number\">0</span><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\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>\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\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>j<span class=\"token punctuation\">)</span>\n\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cin <span class=\"token operator\">>></span> colored_paper<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 punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token function\">divide_and_conquer</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><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> w_cnt <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'\\n'</span> <span class=\"token operator\">&lt;&lt;</span> b_cnt <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>\n<h3>References</h3>\n<p><a href=\"https://data-make.tistory.com/232\">https://data-make.tistory.com/232</a><br>\n<a href=\"https://cinux.tistory.com/13\">https://cinux.tistory.com/13</a><br>\n<a href=\"https://janghw.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Divide-and-Conquer-%EB%B6%84%ED%95%A0%EC%A0%95%EB%B3%B5\">https://janghw.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Divide-and-Conquer-%EB%B6%84%ED%95%A0%EC%A0%95%EB%B3%B5</a><br>\n<a href=\"https://ko.wikipedia.org/wiki/%EB%B6%84%ED%95%A0_%EC%A0%95%EB%B3%B5_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98\">https://ko.wikipedia.org/wiki/%EB%B6%84%ED%95%A0<em>%EC%A0%95%EB%B3%B5</em>%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</a><br>\n<a href=\"https://ko.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/divide-and-conquer-algorithms\">https://ko.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/divide-and-conquer-algorithms</a></p>","fields":{"tagSlugs":["/tags/백준/","/tags/algorithm/"],"slug":"/posts/baekjoons/2630/"},"frontmatter":{"title":"[백준] 2630 : 색종이 만들기","tags":["백준","Algorithm"],"date":"2020-04-13","description":"백준 2630번 문제 : 색종이 만들기"}}},"pageContext":{"slug":"/posts/baekjoons/2630/"}}