{"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":"a0dfe1d1-f61f-5d46-81f7-4d5dccb8f280","html":"<h1>Heap(힙) a.k.a Priority Queue(우선순위 큐)</h1>\n<h2>Heap(힙)이란?</h2>\n<ul>\n<li>데이터의 최대값(혹은 최소값)을 바로 찾을 수 있는 자료구조</li>\n<li>‘Binary Tree(이진 트리)’ 이되 <strong>‘Complete Binary Tree(완전 이진 트리)’</strong> 이다.</li>\n<li>Max Heap : 모든 부모 노드가 자식 노드보다 값이 커야한다.</li>\n<li>Min Heap : 모든 부모 노드가 자식 노드보다 값이 작아야 한다.</li>\n</ul>\n<h2>왜 a.k.a Priority Queue(우선순위 큐)?</h2>\n<ul>\n<li>Priority Queue(우선순위 큐) : 일반적인 큐와 달리 들어간 순서에 상관없이 원소들의 우선순위에 따라 우선순위가 가장 높은 것이 가장 먼저 나오는 자료구조이다.</li>\n<li>Priority Queue(우선순위 큐)의 성질에 의거하여 일반적인 linked list(연결 리스트)나 linear list(배열)보다는 성질이 유사한 heap을 사용하는 것이 유리하다.</li>\n</ul>\n<h2>linked list 구현 vs. linear list(array) 구현</h2>\n<ul>\n<li>linear list 기반으로 힙을 구현하면 새로운 노드를 힙의 ‘마지막 위치’에 추가하는 것이 linear list(배열)에 비해 어렵다.</li>\n<li>Complete Binary Tree 특성 상 linear list로 구현하는 것이 indexing(데이터 접근) 용이하다.</li>\n</ul>\n<h2>Heap(힙) 구현</h2>\n<ol>\n<li>\n<p><strong>insert(data) = 삽입</strong> : data를 heap의 마지막에 삽입 후 부모 노드와 대소 비교를 한다. 부모 노드보다 크면 (min heap : 작으면) data를 swap을 하고 부모 노드보다 작으면 (min heap : 크면) 현재 위치를 유지한다. root까지 반복한다.</p>\n</li>\n<li>\n<p><strong>withdraw() = 삭제</strong> : root 노드의 data를 꺼내고, heap의 마지막 원소를 root로 올린 후 자식 노드와 대소 비교를 한다. 자식 노드보다 작으면 (혹은 min heap : 크면) swap을 하고 자식 노드보다 크면 (min heap : 작으면) 현재 위치를 유지한다. leaf node(단말 노드)까지 반복한다. 자식 노드가 2개일 시 두 노드의 대소 비교 후 큰 (min heap : 작은) 자식 노드를 대소 비교에 쓴다.</p>\n</li>\n<li>\n<p><strong>현재 위치 = idx<br>\n부모 노드 = idx / 2<br>\n왼쪽 자식 노드 = idx * 2<br>\n오른쪽 자식 노드 = idx * 2 + 1</strong></p>\n</li>\n</ol>\n<h2>Max Heap 구현 코드 (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\ntemplate <span class=\"token operator\">&lt;</span>typename T<span class=\"token operator\">></span>\nclass Max_Heap <span class=\"token punctuation\">{</span>\nprivate<span class=\"token punctuation\">:</span>\n\tT<span class=\"token operator\">*</span> data_arr<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">int</span> size<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">int</span> num_data<span class=\"token punctuation\">;</span>\n\t\npublic<span class=\"token punctuation\">:</span>\n\t<span class=\"token function\">Max_Heap</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> size <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">:</span> <span class=\"token function\">data_arr</span><span class=\"token punctuation\">(</span>new T<span class=\"token punctuation\">[</span>size<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">size</span><span class=\"token punctuation\">(</span>size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">num_data</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\t\n\t<span class=\"token operator\">~</span><span class=\"token function\">Max_Heap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>delete<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> data_arr<span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">insert</span><span class=\"token punctuation\">(</span>T data<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token operator\">++</span>num_data<span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num_data <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// no data before</span>\n\t\t\tdata_arr<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> data<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// at least one data exist</span>\n\t\t\tdata_arr<span class=\"token punctuation\">[</span>num_data<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> data<span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">int</span> parent_idx <span class=\"token operator\">=</span> num_data <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">int</span> child_idx <span class=\"token operator\">=</span> num_data<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">do</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>child_idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>parent_idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>child_idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>parent_idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\tchild_idx <span class=\"token operator\">=</span> parent_idx<span class=\"token punctuation\">;</span>\n\t\t\t\t\tparent_idx <span class=\"token operator\">=</span> child_idx <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>parent_idx <span class=\"token operator\">>=</span> <span class=\"token number\">1</span><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\tT <span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num_data <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// no data before</span>\n\t\t\t<span class=\"token keyword\">return</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// error code (up to data-type)</span>\n\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// at least one data exist</span>\n\t\t\tT return_data <span class=\"token operator\">=</span> data_arr<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num_data <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// only root data exists</span>\n\t\t\t\tdata_arr<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\">0</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tdata_arr<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> data_arr<span class=\"token punctuation\">[</span>num_data<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\t\t\t\tdata_arr<span class=\"token punctuation\">[</span>num_data<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\n\t\t\t\t<span class=\"token keyword\">int</span> idx <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// root</span>\n\t\t\t\t\n\t\t\t\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// until leaf node</span>\n\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// only one child exists</span>\n\t\t\t\t\t\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// left child exists</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// current node &lt; left child</span>\n\t\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t\tidx <span class=\"token operator\">*</span><span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">else</span>\n\t\t\t\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// right child exists</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// current node &lt; right child</span>\n\t\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t\tidx <span class=\"token operator\">=</span> idx <span class=\"token operator\">*</span> <span class=\"token number\">2</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t<span class=\"token punctuation\">}</span> \n\t\t\t\t\t\t\t<span class=\"token keyword\">else</span>\n\t\t\t\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// both children exist</span>\n\t\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// left child > right child &amp;&amp; current node &lt; left child</span>\n\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\tidx <span class=\"token operator\">*</span><span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// left child &lt; right child &amp;&amp; current node &lt; right child</span>\n\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\tidx <span class=\"token operator\">=</span> idx <span class=\"token operator\">*</span> <span class=\"token number\">2</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t<span class=\"token keyword\">else</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\n\t\t\t<span class=\"token operator\">--</span>num_data<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">return</span> return_data<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\n\tfriend std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>ostream<span class=\"token operator\">&amp;</span> operator <span class=\"token operator\">&lt;&lt;</span><span class=\"token punctuation\">(</span>std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>ostream <span class=\"token operator\">&amp;</span>out<span class=\"token punctuation\">,</span> Max_Heap <span class=\"token operator\">&amp;</span>heap<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\tT <span class=\"token operator\">*</span>temp <span class=\"token operator\">=</span> heap<span class=\"token punctuation\">.</span>data_arr<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">int</span> power <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t\n\t\tout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"──────────────────────────────────\"</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\t\n\t\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> heap<span class=\"token punctuation\">.</span>num_data<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> temp<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>i <span class=\"token operator\">==</span> std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> power<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token operator\">++</span>power<span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>heap<span class=\"token punctuation\">.</span>num_data <span class=\"token operator\">!=</span> std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> power<span class=\"token operator\">-</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\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\tout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"──────────────────────────────────\"</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\t\n\t\t<span class=\"token keyword\">return</span> out<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><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\tMax_Heap<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> <span class=\"token function\">heap</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\n\theap<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span><span class=\"token number\">9</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 operator\">&lt;&lt;</span> heap <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\theap<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</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 operator\">&lt;&lt;</span> heap <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\theap<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</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 operator\">&lt;&lt;</span> heap <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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap<span class=\"token punctuation\">.</span><span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap <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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap<span class=\"token punctuation\">.</span><span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap <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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap<span class=\"token punctuation\">.</span><span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap <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\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<h2>Min Heap 구현 코드 (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\ntemplate <span class=\"token operator\">&lt;</span>typename T<span class=\"token operator\">></span>\nclass Min_Heap <span class=\"token punctuation\">{</span>\nprivate<span class=\"token punctuation\">:</span>\n\tT<span class=\"token operator\">*</span> data_arr<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">int</span> size<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">int</span> num_data<span class=\"token punctuation\">;</span>\n\t\npublic<span class=\"token punctuation\">:</span>\n\t<span class=\"token function\">Min_Heap</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> size <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">:</span> <span class=\"token function\">data_arr</span><span class=\"token punctuation\">(</span>new T<span class=\"token punctuation\">[</span>size<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">size</span><span class=\"token punctuation\">(</span>size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">num_data</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\t\n\t<span class=\"token operator\">~</span><span class=\"token function\">Min_Heap</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>delete<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> data_arr<span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">insert</span><span class=\"token punctuation\">(</span>T data<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token operator\">++</span>num_data<span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num_data <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// no data before</span>\n\t\t\tdata_arr<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> data<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// at least one data exist</span>\n\t\t\tdata_arr<span class=\"token punctuation\">[</span>num_data<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> data<span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">int</span> parent_idx <span class=\"token operator\">=</span> num_data <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">int</span> child_idx <span class=\"token operator\">=</span> num_data<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">do</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>child_idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> data_arr<span class=\"token punctuation\">[</span>parent_idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>child_idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>parent_idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\tchild_idx <span class=\"token operator\">=</span> parent_idx<span class=\"token punctuation\">;</span>\n\t\t\t\t\tparent_idx <span class=\"token operator\">=</span> child_idx <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>parent_idx <span class=\"token operator\">>=</span> <span class=\"token number\">1</span><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\tT <span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num_data <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// no data before</span>\n\t\t\t<span class=\"token keyword\">return</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// error code (up to data-type)</span>\n\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// at least one data exist</span>\n\t\t\tT return_data <span class=\"token operator\">=</span> data_arr<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num_data <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// only root exists</span>\n\t\t\t\tdata_arr<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\">0</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tdata_arr<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> data_arr<span class=\"token punctuation\">[</span>num_data<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\t\t\t\tdata_arr<span class=\"token punctuation\">[</span>num_data<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\n\t\t\t\t<span class=\"token keyword\">int</span> idx <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// root index</span>\n\t\t\t\t\n\t\t\t\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// until leaf node</span>\n\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// only one child exists</span>\n\t\t\t\t\t\t<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// left child exists</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// current node > left child</span>\n\t\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t\tidx <span class=\"token operator\">*</span><span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">else</span>\n\t\t\t\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// right child exists</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// current node > right child</span>\n\t\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t\tidx <span class=\"token operator\">=</span> idx <span class=\"token operator\">*</span> <span class=\"token number\">2</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\t<span class=\"token punctuation\">}</span> \n\t\t\t\t\t\t\t<span class=\"token keyword\">else</span>\n\t\t\t\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// both children exist</span>\n\t\t\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// left child &lt; right child &amp;&amp; current node > left child</span>\n\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\tidx <span class=\"token operator\">*</span><span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t<span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;&amp;</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// left child > right child &amp;&amp; current node > right child</span>\n\t\t\t\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">swap</span><span class=\"token punctuation\">(</span>data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> data_arr<span class=\"token punctuation\">[</span>idx<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t\tidx <span class=\"token operator\">=</span> idx <span class=\"token operator\">*</span> <span class=\"token number\">2</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\t\t<span class=\"token keyword\">else</span>\n\t\t\t\t\t\t\t<span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\n\t\t\t<span class=\"token operator\">--</span>num_data<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">return</span> return_data<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\n\tfriend std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>ostream<span class=\"token operator\">&amp;</span> operator <span class=\"token operator\">&lt;&lt;</span><span class=\"token punctuation\">(</span>std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>ostream <span class=\"token operator\">&amp;</span>out<span class=\"token punctuation\">,</span> Min_Heap <span class=\"token operator\">&amp;</span>heap<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\t\tT <span class=\"token operator\">*</span>temp <span class=\"token operator\">=</span> heap<span class=\"token punctuation\">.</span>data_arr<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">int</span> power <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\t\n\t\tout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"──────────────────────────────────\"</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\t\n\t\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> heap<span class=\"token punctuation\">.</span>num_data<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> temp<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>i <span class=\"token operator\">==</span> std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> power<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token operator\">++</span>power<span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>heap<span class=\"token punctuation\">.</span>num_data <span class=\"token operator\">!=</span> std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> power<span class=\"token operator\">-</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\t\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\tout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"──────────────────────────────────\"</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\t\n\t\t<span class=\"token keyword\">return</span> out<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\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\tMin_Heap<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> <span class=\"token function\">heap</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\n\theap<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span><span class=\"token number\">9</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 operator\">&lt;&lt;</span> heap <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\theap<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</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 operator\">&lt;&lt;</span> heap <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\theap<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</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 operator\">&lt;&lt;</span> heap <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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap<span class=\"token punctuation\">.</span><span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap <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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap<span class=\"token punctuation\">.</span><span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap <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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap<span class=\"token punctuation\">.</span><span class=\"token function\">withdraw</span><span class=\"token punctuation\">(</span><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\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> heap <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\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://velog.io/@pa324/%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90-1xk1cw46t2\">https://velog.io/@pa324/%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90-1xk1cw46t2</a><br>\n<a href=\"https://www.crocus.co.kr/379\">https://www.crocus.co.kr/379</a><br>\n<a href=\"https://medium.com/jiwon-bae/data-structure-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90%EC%99%80-%ED%9E%99-c01947539d3d\">https://medium.com/jiwon-bae/data-structure-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90%EC%99%80-%ED%9E%99-c01947539d3d</a><br>\n<a href=\"https://ohdumak.tistory.com/75\">https://ohdumak.tistory.com/75</a></p>","fields":{"tagSlugs":["/tags/data-structure/"],"slug":"/posts/data_structures/heap_priority_queue/"},"frontmatter":{"title":"[자료구조] Heap(힙) a.k.a Priority Queue(우선순위 큐)","tags":["Data Structure"],"date":"2020-04-05","description":"Heap(힙) a.k.a Priority Queue(우선순위 큐)에 대해 알아보자."}}},"pageContext":{"slug":"/posts/data_structures/heap_priority_queue/"}}