{"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":"5d508597-5e73-59b5-948c-62e89da8d243","html":"<h1>1966번 : 프린터 큐</h1>\n<p>👉 <a href=\"https://www.acmicpc.net/problem/1966\">문제 바로가기</a></p>\n<h2>배경 지식</h2>\n<ul>\n<li><code class=\"language-text\">큐(Queue)</code> : 먼저 집어 넣은 데이터가 먼저 나오는 <strong>FIFO(First In First Oout)구조</strong>로 데이터를 저장하는 자료 구조</li>\n</ul>\n<h2>푼 방법</h2>\n<p>우선 큐 클래스에 전체 노드를 순회하고 최대 값을 구하는 메소드를 추가했다. 그리고 문서들의 중요도를 순서대로 큐에 en<em>queue하고 몇 번째로 인쇄되는지 알고 싶은 문서는 0으로 en</em>queue하고 그 문서의 중요도는 따로 변수에 저장했다; 0으로 flag 역할을 수행시키기 위해서였다.</p>\n<p>큐에 문서들의 중요도를 순서대로 다 저장한 후, 문제에서 요구한 rule대로 de_queue했을 때 중요도를 큐에 현존하는 최대 중요도 값과 비교하면서 인쇄 순서를 count해나갔다. 알고싶은 문서는 0으로 flag해놔서 idx가 변화해도 쉽게 알 수 있다; 중요도는 따로 저장해둔 변수 활용하여 비교했다.</p>\n<p>이번 풀이법은 개인적으로 마음에 들지 않는다. 이런 방법으로도 비효율적으로 풀 수 있구나, 이래서 자료구조를 빠삭하게 공부해야 하는 구나라고 느끼며 이 포스트를 읽었으면 좋겠다.</p>\n<p>프린터 큐이기 때문에 큐를 갖고 풀 생각만 했다. 제목에서 고정관념을 갖고 사고의 폭을 넓히지 못했던 것 같다.</p>\n<p>다음 포스트에서는 우선순위 큐와 힙을 정리하고, 좀 더 효율적이고 깔끔한 방법으로 이 문제를 다시 풀어 볼 예정이다.</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\ntemplate <span class=\"token operator\">&lt;</span>typename T<span class=\"token operator\">></span>\n<span class=\"token keyword\">struct</span> Node <span class=\"token punctuation\">{</span>\n\tT data<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">struct</span> Node <span class=\"token operator\">*</span>front<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">struct</span> Node <span class=\"token operator\">*</span>rear<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\ntemplate <span class=\"token operator\">&lt;</span>typename T<span class=\"token operator\">></span>\nclass Queue <span class=\"token punctuation\">{</span>\nprivate<span class=\"token punctuation\">:</span>\n\tNode<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span> <span class=\"token operator\">*</span>head<span class=\"token punctuation\">;</span>\n\tNode<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span> <span class=\"token operator\">*</span>tail<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">int</span> size<span class=\"token punctuation\">;</span>\n\t\npublic<span class=\"token punctuation\">:</span>\n\t<span class=\"token function\">Queue</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">:</span> <span class=\"token function\">head</span><span class=\"token punctuation\">(</span>nullptr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">tail</span><span class=\"token punctuation\">(</span>nullptr<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">,</span> <span class=\"token function\">size</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<span class=\"token operator\">~</span><span class=\"token function\">Queue</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>this<span class=\"token operator\">-></span>head <span class=\"token operator\">==</span> nullptr<span class=\"token punctuation\">)</span>\n\t\t\t<span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n\t\t\n\t\tNode<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span> <span class=\"token operator\">*</span>cur <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>tail<span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>cur <span class=\"token operator\">!=</span> nullptr<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\tcur <span class=\"token operator\">=</span> cur<span class=\"token operator\">-></span>front<span class=\"token punctuation\">;</span>\n\t\t\tdelete this<span class=\"token operator\">-></span>tail<span class=\"token punctuation\">;</span>\n\t\t\tthis<span class=\"token operator\">-></span>tail <span class=\"token operator\">=</span> cur<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\tthis<span class=\"token operator\">-></span>head <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>tail<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">int</span> <span class=\"token function\">get_size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> this<span class=\"token operator\">-></span>size<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\tbool <span class=\"token function\">is_empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> this<span class=\"token operator\">-></span>head <span class=\"token operator\">==</span> nullptr <span class=\"token operator\">?</span> true <span class=\"token punctuation\">:</span> false<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\tT <span class=\"token function\">get_max</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">is_empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">return</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        \n\t\tNode<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span> <span class=\"token operator\">*</span>cur <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>tail<span class=\"token punctuation\">;</span>\n\t\tT max <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>tail<span class=\"token operator\">-></span>data<span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>cur <span class=\"token operator\">!=</span> nullptr<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>cur<span class=\"token operator\">-></span>data <span class=\"token operator\">></span> max<span class=\"token punctuation\">)</span>\n\t\t\t\tmax <span class=\"token operator\">=</span> cur<span class=\"token operator\">-></span>data<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\tcur <span class=\"token operator\">=</span> cur<span class=\"token operator\">-></span>front<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token keyword\">return</span> max<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\t<span class=\"token keyword\">void</span> <span class=\"token function\">en_queue</span><span class=\"token punctuation\">(</span>T value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\tNode<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span> <span class=\"token operator\">*</span>node <span class=\"token operator\">=</span> new Node<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\t\tnode<span class=\"token operator\">-></span>data <span class=\"token operator\">=</span> value<span class=\"token punctuation\">;</span>\n\t\tnode<span class=\"token operator\">-></span>front <span class=\"token operator\">=</span> nullptr<span class=\"token punctuation\">;</span>\n\t\tnode<span class=\"token operator\">-></span>rear <span class=\"token operator\">=</span> nullptr<span class=\"token punctuation\">;</span>\n\t\t\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">is_empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// first push.</span>\n\t\t\tthis<span class=\"token operator\">-></span>head <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\tnode<span class=\"token operator\">-></span>front <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>tail<span class=\"token punctuation\">;</span>\n\t\t\tthis<span class=\"token operator\">-></span>tail<span class=\"token operator\">-></span>rear <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\tthis<span class=\"token operator\">-></span>tail <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token operator\">++</span>size<span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\tT <span class=\"token function\">de_queue</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><span class=\"token function\">is_empty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// empty queue</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\">// T type에 맞는 error code return.</span>\n\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">int</span> pop_val <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>head<span class=\"token operator\">-></span>data<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>this<span class=\"token operator\">-></span>head <span class=\"token operator\">==</span> this<span class=\"token operator\">-></span>tail<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// queue with 1 element.</span>\n\t\t\t\tdelete this<span class=\"token operator\">-></span>head<span class=\"token punctuation\">;</span>\n\t\t\t\tthis<span class=\"token operator\">-></span>head <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>tail <span class=\"token operator\">=</span> nullptr<span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// queue with more than 2 elements.</span>\n\t\t\t\tNode<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span> <span class=\"token operator\">*</span>node <span class=\"token operator\">=</span> new Node<span class=\"token operator\">&lt;</span>T<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\t\t\t\t\n\t\t\t\tnode <span class=\"token operator\">=</span> this<span class=\"token operator\">-></span>head<span class=\"token operator\">-></span>rear<span class=\"token punctuation\">;</span>\n\t\t\t\t\n\t\t\t\tdelete this<span class=\"token operator\">-></span>head<span class=\"token punctuation\">;</span>\n\t\t\t\t\n\t\t\t\tthis<span class=\"token operator\">-></span>head <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n\t\t\t\tthis<span class=\"token operator\">-></span>head<span class=\"token operator\">-></span>front <span class=\"token operator\">=</span> nullptr<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>size<span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">return</span> pop_val<span class=\"token punctuation\">;</span>\n\t\t<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\t<span class=\"token keyword\">int</span> n<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\">int</span> n_doc<span class=\"token punctuation\">,</span> m<span class=\"token punctuation\">,</span> m_priority<span class=\"token punctuation\">,</span> priority<span class=\"token punctuation\">,</span> cnt <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\t\tQueue<span class=\"token operator\">&lt;</span><span class=\"token keyword\">int</span><span class=\"token operator\">></span> queue<span class=\"token punctuation\">;</span>\n\t\t\n\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cin <span class=\"token operator\">>></span> n_doc <span class=\"token operator\">>></span> m<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> 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_doc<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>j<span class=\"token punctuation\">)</span> <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> priority<span class=\"token punctuation\">;</span>\n\t\t\t\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">==</span> m<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\tqueue<span class=\"token punctuation\">.</span><span class=\"token function\">en_queue</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\tm_priority <span class=\"token operator\">=</span> priority<span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t<span class=\"token keyword\">else</span>\n\t\t\t\tqueue<span class=\"token punctuation\">.</span><span class=\"token function\">en_queue</span><span class=\"token punctuation\">(</span>priority<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n_doc <span class=\"token operator\">==</span> <span class=\"token number\">1</span><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> <span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>m_priority <span class=\"token operator\">!=</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\tpriority <span class=\"token operator\">=</span> queue<span class=\"token punctuation\">.</span><span class=\"token function\">de_queue</span><span class=\"token punctuation\">(</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>priority <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\">// 궁금한 문서</span>\n\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>m_priority <span class=\"token operator\">&lt;</span> queue<span class=\"token punctuation\">.</span><span class=\"token function\">get_max</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\t\t\t\t\tqueue<span class=\"token punctuation\">.</span><span class=\"token function\">en_queue</span><span class=\"token punctuation\">(</span>priority<span class=\"token punctuation\">)</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\t<span class=\"token operator\">++</span>cnt<span class=\"token punctuation\">;</span>\n\t\t\t\t\tm_priority <span class=\"token operator\">=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</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>\n\t\t\t<span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 궁금하지 않은 나머지 일반 문서들</span>\n\t\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>priority <span class=\"token operator\">&lt;</span> queue<span class=\"token punctuation\">.</span><span class=\"token function\">get_max</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> priority <span class=\"token operator\">&lt;</span> m_priority<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t\tqueue<span class=\"token punctuation\">.</span><span class=\"token function\">en_queue</span><span class=\"token punctuation\">(</span>priority<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t\t\t<span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n\t\t\t\t<span class=\"token punctuation\">}</span>\n\t\t\t\t\n\t\t\t\t<span class=\"token operator\">++</span>cnt<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\n\t\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> cnt <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">'\\n'</span><span class=\"token punctuation\">;</span>\n\t<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/1966/"},"frontmatter":{"title":"[백준] 1966 : 프린터 큐","tags":["백준","Algorithm"],"date":"2020-04-03","description":"백준 1966번 문제 : 프린터 큐"}}},"pageContext":{"slug":"/posts/baekjoons/1966/"}}