{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/pg-64063/",
    "result": {"data":{"cur":{"id":"e73e1065-b86f-5d53-a474-69d60a21ff27","html":"<h2 id=\"2019-카카오-개발자-겨울-인턴십\" style=\"position:relative;\"><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2019 카카오 개발자 겨울 인턴십 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[2019 카카오 개발자 겨울 인턴십]</h2>\n<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제</h2>\n<p><a href=\"https://programmers.co.kr/learn/courses/30/lessons/64063\">https://programmers.co.kr/learn/courses/30/lessons/64063</a></p>\n<p>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</p>\n<p>“스노우타운”에서 호텔을 운영하고 있는 “스카피”는 호텔에 투숙하려는 고객들에게 방을 배정하려 합니다. 호텔에는 방이 총 k개 있으며, 각각의 방은 1번부터 k번까지 번호로 구분하고 있습니다. 처음에는 모든 방이 비어 있으며 “스카피”는 다음과 같은 규칙에 따라 고객에게 방을 배정하려고 합니다.</p>\n<ol>\n<li>한 번에 한 명씩 신청한 순서대로 방을 배정합니다.</li>\n<li>고객은 투숙하기 원하는 방 번호를 제출합니다.</li>\n<li>고객이 원하는 방이 비어 있다면 즉시 배정합니다.</li>\n<li>고객이 원하는 방이 이미 배정되어 있으면 원하는 방보다 번호가 크면서 비어있는 방 중 가장 번호가 작은 방을 배정합니다.</li>\n</ol>\n<p>예를 들어, 방이 총 10개이고, 고객들이 원하는 방 번호가 순서대로 [1, 3, 4, 1, 3, 1] 일 경우 다음과 같이 방을 배정받게 됩니다.</p>\n<table>\n<thead>\n<tr>\n<th>원하는 방 번호</th>\n<th>배정된 방 번호</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>1</td>\n</tr>\n<tr>\n<td>3</td>\n<td>3</td>\n</tr>\n<tr>\n<td>4</td>\n<td>4</td>\n</tr>\n<tr>\n<td>1</td>\n<td>2</td>\n</tr>\n<tr>\n<td>3</td>\n<td>5</td>\n</tr>\n<tr>\n<td>1</td>\n<td>6</td>\n</tr>\n</tbody>\n</table>\n<p>전체 방 개수 k와 고객들이 원하는 방 번호가 순서대로 들어있는 배열 room_number가 매개변수로 주어질 때, 각 고객에게 배정되는 방 번호를 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.</p>\n<hr>\n<h2 id=\"제한사항\" style=\"position:relative;\"><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\" aria-label=\"제한사항 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>제한사항</h2>\n<ul>\n<li>k는 1 이상 1012 이하인 자연수입니다.</li>\n<li>room_number 배열의 크기는 1 이상 200,000 이하입니다.</li>\n<li>room_number 배열 각 원소들의 값은 1 이상 k 이하인 자연수입니다.</li>\n<li>room_number 배열은 모든 고객이 방을 배정받을 수 있는 경우만 입력으로 주어집니다.\n<ul>\n<li>예를 들어, k = 5, room_number = [5, 5] 와 같은 경우는 방을 배정받지 못하는 고객이 발생하므로 이런 경우는 입력으로 주어지지 않습니다.</li>\n</ul>\n</li>\n</ul>\n<hr>\n<h2 id=\"입출력-예\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\" aria-label=\"입출력 예 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>입출력 예</h2>\n<table>\n<thead>\n<tr>\n<th>k</th>\n<th>room_number</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>10</td>\n<td>[1,3,4,1,3,1]</td>\n<td>[1,3,4,2,5,6]</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔍 Algorithm</h2>\n<p><strong>DP</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">    dp <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># 원하는 방에 대해 갈 수 있는 다음 방 번호 메모이제이션 (0이면 비어있다는 뜻)</span>\n    <span class=\"token comment\"># 한 명씩 빈 방 찾아서 배정</span>\n    <span class=\"token keyword\">for</span> num <span class=\"token keyword\">in</span> room_number<span class=\"token punctuation\">:</span>\n        temp <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        next_num <span class=\"token operator\">=</span> num\n        <span class=\"token comment\"># 빈 방을 찾을 때까지 탐색</span>\n        <span class=\"token keyword\">while</span> dp<span class=\"token punctuation\">[</span>next_num<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n            next_num <span class=\"token operator\">=</span> dp<span class=\"token punctuation\">[</span>next_num<span class=\"token punctuation\">]</span>\n            temp<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>next_num<span class=\"token punctuation\">)</span>   <span class=\"token comment\"># 나중에 dp 한번에 업데이트 하기 위해 따로 저장</span>\n        <span class=\"token comment\"># 빈 방 다음 위치로 dp 업데이트</span>\n        dp<span class=\"token punctuation\">[</span>next_num<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_num <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> temp<span class=\"token punctuation\">:</span>\n            dp<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_num <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n        <span class=\"token comment\"># 빈 방으로 배정</span>\n        answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>next_num<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n<ul>\n<li><strong>메모이제이션</strong><br>\n원하는 방이 비어 있지 않는 경우에 다음 가능한 방을 빨리 찾을 수 있도록 갈 수 있는 다음 방 번호를 저장해둔다.<br>\n<code class=\"language-text\">defaultdict</code>를 사용해서 <strong>dictionary</strong> 형태로 저장하고, 기본값을 <strong>0</strong>으로 설정해서 <strong>0</strong>이면 <strong>비어 있는 상태</strong></li>\n<li><strong>빈 방을 찾을 때까지 탐색</strong><br>\n해당 방 번호의 <code class=\"language-text\">dp</code> 값이 존재하면 그 <code class=\"language-text\">dp</code> 값으로 계속 반복해서 <code class=\"language-text\">dp</code> 값이 <strong>0</strong>일 때까지 찾는다.<br>\n탐색 과정에서 방문한 방 번호들은 나중에 <code class=\"language-text\">dp</code>를 한번에 업데이트 하기 위해 따로 저장해두고,<br>\n빈 방 다음 위치로 방문한 <code class=\"language-text\">dp</code> 값들을 전부 업데이트한다.<br>\n찾은 빈 방은 <code class=\"language-text\">answer</code>에 <strong>append</strong></li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> defaultdict\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">,</span> room_number<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    dp <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># 원하는 방에 대해 갈 수 있는 다음 방 번호 메모이제이션 (0이면 비어있다는 뜻)</span>\n    <span class=\"token comment\"># 한 명씩 빈 방 찾아서 배정</span>\n    <span class=\"token keyword\">for</span> num <span class=\"token keyword\">in</span> room_number<span class=\"token punctuation\">:</span>\n        temp <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        next_num <span class=\"token operator\">=</span> num\n        <span class=\"token comment\"># 빈 방을 찾을 때까지 탐색</span>\n        <span class=\"token keyword\">while</span> dp<span class=\"token punctuation\">[</span>next_num<span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n            next_num <span class=\"token operator\">=</span> dp<span class=\"token punctuation\">[</span>next_num<span class=\"token punctuation\">]</span>\n            temp<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>next_num<span class=\"token punctuation\">)</span>   <span class=\"token comment\"># 나중에 dp 한번에 업데이트 하기 위해 따로 저장</span>\n        <span class=\"token comment\"># 빈 방 다음 위치로 dp 업데이트</span>\n        dp<span class=\"token punctuation\">[</span>next_num<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_num <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> temp<span class=\"token punctuation\">:</span>\n            dp<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_num <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n        <span class=\"token comment\"># 빈 방으로 배정</span>\n        answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>next_num<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p>간단하게 딕셔너리만 사용해서 풀었는데 역시 효율성에서 다 걸렸다.<br>\n그러다가 다음 가야 되는 위치를 메모이제이션 하면 더 빠르게 찾을 수 있겠다고 생각해서 DP로 풀었다.</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2019 카카오 개발자 겨울 인턴십]</a></li>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\">제한사항</a></li>\n<li><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\">입출력 예</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","excerpt":"[2019 카카오 개발자 겨울 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/64063 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] “스노우타운”에서 호텔을 운영하고 있는 “스카피”는 호텔에 투숙하려는 고객들에게 방을 배정하려 합니다. 호텔에는 방이 총 k개 있으며, 각각의 방은 1번부터 k번까지 번호로 구분하고 있습니다. 처음에는 모든 방이 비어 있으며 “스카피”는 다음과 같은 규칙에 따라 고객에게 방을 배정하려고 합니다. 한 번에 한 명씩 신청한 순서대로 방을 배정합니다. 고객은 투숙하기 원하는 방 번호를 제출합니다. 고객이 원하는 방이 비어 있다면 즉시 배정합니다. 고객이 원하는 방이 이미 배정되어 있으면 원하는 방보다 번호가 크면서 비어있는 방 중 가장 번호가 작은 방을 배정합니다. 예를 들어, 방이 총 10개이고, 고객들이 원하는 방 번호가 순서대로 [1, 3, 4, 1, 3, 1] 일 경우…","frontmatter":{"date":"May 16, 2022","title":"[Programmers] 64063번: 호텔 방 배정 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-64063/"}},"next":{"id":"547c5b24-cab3-5892-8479-646636e70e64","html":"<h2 id=\"2019-카카오-개발자-겨울-인턴십\" style=\"position:relative;\"><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2019 카카오 개발자 겨울 인턴십 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[2019 카카오 개발자 겨울 인턴십]</h2>\n<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제</h2>\n<p><a href=\"https://programmers.co.kr/learn/courses/30/lessons/64064\">https://programmers.co.kr/learn/courses/30/lessons/64064</a></p>\n<p>개발팀 내에서 이벤트 개발을 담당하고 있는 “무지”는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량 사용자라는 이름으로 목록을 만들어서 당첨 처리 시 제외하도록 이벤트 당첨자 담당자인 “프로도” 에게 전달하려고 합니다. 이 때 개인정보 보호을 위해 사용자 아이디 중 일부 문자를 ’<em>’ 문자로 가려서 전달했습니다. 가리고자 하는 문자 하나에 ’</em>’ 문자 하나를 사용하였고 아이디 당 최소 하나 이상의 ’*’ 문자를 사용하였습니다.<br>\n“무지”와 “프로도”는 불량 사용자 목록에 매핑된 응모자 아이디를 제재 아이디 라고 부르기로 하였습니다.</p>\n<p>예를 들어, 이벤트에 응모한 전체 사용자 아이디 목록이 다음과 같다면</p>\n<table>\n<thead>\n<tr>\n<th>응모자 아이디</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>frodo</td>\n</tr>\n<tr>\n<td>fradi</td>\n</tr>\n<tr>\n<td>crodo</td>\n</tr>\n<tr>\n<td>abc123</td>\n</tr>\n<tr>\n<td>frodoc</td>\n</tr>\n</tbody>\n</table>\n<p>다음과 같이 불량 사용자 아이디 목록이 전달된 경우,</p>\n<table>\n<thead>\n<tr>\n<th>불량 사용자</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>fr<em>d</em></td>\n</tr>\n<tr>\n<td>abc1**</td>\n</tr>\n</tbody>\n</table>\n<p>불량 사용자에 매핑되어 당첨에서 제외되어야 야 할 제재 아이디 목록은 다음과 같이 두 가지 경우가 있을 수 있습니다.</p>\n<table>\n<thead>\n<tr>\n<th>제재 아이디</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>frodo</td>\n</tr>\n<tr>\n<td>abc123</td>\n</tr>\n</tbody>\n</table>\n<table>\n<thead>\n<tr>\n<th>제재 아이디</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>fradi</td>\n</tr>\n<tr>\n<td>abc123</td>\n</tr>\n</tbody>\n</table>\n<p>이벤트 응모자 아이디 목록이 담긴 배열 user_id와 불량 사용자 아이디 목록이 담긴 배열 banned_id가 매개변수로 주어질 때, 당첨에서 제외되어야 할 제재 아이디 목록은 몇가지 경우의 수가 가능한 지 return 하도록 solution 함수를 완성해주세요.</p>\n<hr>\n<h2 id=\"제한사항\" style=\"position:relative;\"><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\" aria-label=\"제한사항 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>제한사항</h2>\n<ul>\n<li>user_id 배열의 크기는 1 이상 8 이하입니다.</li>\n<li>user_id 배열 각 원소들의 값은 길이가 1 이상 8 이하인 문자열입니다.\n<ul>\n<li>응모한 사용자 아이디들은 서로 중복되지 않습니다.</li>\n<li>응모한 사용자 아이디는 알파벳 소문자와 숫자로만으로 구성되어 있습니다.</li>\n</ul>\n</li>\n<li>banned_id 배열의 크기는 1 이상 user_id 배열의 크기 이하입니다.</li>\n<li>banned_id 배열 각 원소들의 값은 길이가 1 이상 8 이하인 문자열입니다.\n<ul>\n<li>불량 사용자 아이디는 알파벳 소문자와 숫자, 가리기 위한 문자 ’*’ 로만 이루어져 있습니다.</li>\n<li>불량 사용자 아이디는 ’*’ 문자를 하나 이상 포함하고 있습니다.</li>\n<li>불량 사용자 아이디 하나는 응모자 아이디 중 하나에 해당하고 같은 응모자 아이디가 중복해서 제재 아이디 목록에 들어가는 경우는 없습니다.</li>\n</ul>\n</li>\n<li>제재 아이디 목록들을 구했을 때 아이디들이 나열된 순서와 관계없이 아이디 목록의 내용이 동일하다면 같은 것으로 처리하여 하나로 세면 됩니다.</li>\n</ul>\n<hr>\n<h2 id=\"입출력-예\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\" aria-label=\"입출력 예 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>입출력 예</h2>\n<table>\n<thead>\n<tr>\n<th>user_id</th>\n<th>banned_id</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>[“frodo”, “fradi”, “crodo”, “abc123”, “frodoc”]</td>\n<td>[<code class=\"language-text\">\"fr*d*\"</code>, <code class=\"language-text\">\"abc1**\"</code>]</td>\n<td>2</td>\n</tr>\n<tr>\n<td>[“frodo”, “fradi”, “crodo”, “abc123”, “frodoc”]</td>\n<td>[<code class=\"language-text\">\"*rodo\"</code>, <code class=\"language-text\">\"*rodo\"</code>, <code class=\"language-text\">\"******\"</code>]</td>\n<td>2</td>\n</tr>\n<tr>\n<td>[“frodo”, “fradi”, “crodo”, “abc123”, “frodoc”]</td>\n<td>[<code class=\"language-text\">\"fr*d*\"</code>, <code class=\"language-text\">\"*rodo\"</code>, <code class=\"language-text\">\"******\"</code>, <code class=\"language-text\">\"******\"</code>]</td>\n<td>3</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔍 Algorithm</h2>\n<p><strong>문자열, 순열</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">    order_list <span class=\"token operator\">=</span> permutations<span class=\"token punctuation\">(</span>user_id<span class=\"token punctuation\">,</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>banned_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 순열 생성</span>\n    <span class=\"token keyword\">for</span> order <span class=\"token keyword\">in</span> order_list<span class=\"token punctuation\">:</span>\n        check <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n        <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> <span class=\"token builtin\">id</span> <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>banned_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 정규 표현식 사용 (^: 시작 부분 매치 확인, $: 끝 부분 매치 확인)</span>\n            pattern <span class=\"token operator\">=</span> re<span class=\"token punctuation\">.</span><span class=\"token builtin\">compile</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"^</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token builtin\">id</span><span class=\"token punctuation\">.</span>replace<span class=\"token punctuation\">(</span><span class=\"token string\">'*'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">$\"</span></span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># '*'는 '.'으로 치환</span>\n            <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> pattern<span class=\"token punctuation\">.</span>match<span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> check <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span>\n        <span class=\"token comment\"># 전부 다 일치하는 경우</span>\n        <span class=\"token keyword\">if</span> check<span class=\"token punctuation\">:</span>\n            order <span class=\"token operator\">=</span> <span class=\"token builtin\">sorted</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 중복 제거를 위해 우선 정렬</span>\n            result<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token builtin\">tuple</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># set 처리하기 위해 tuple로 변환 후 append</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># set 이용해서 중복 제거</span></code></pre></div>\n<ul>\n<li><strong>순열 생성</strong><br>\n<strong>permutations</strong>를 사용해서 <code class=\"language-text\">user_id</code> 배열에서 <code class=\"language-text\">len(banned_id)</code>개의 원소를 뽑는 순열을 만든다.<br>\n생성된 모든 순열을 비교하면서 경우의 수 확인</li>\n<li><strong>정규 표현식 사용</strong><br>\n<code class=\"language-text\">f</code> 포매팅과 <code class=\"language-text\">replace</code>를 이용하여 <code class=\"language-text\">*</code> 문자를 <code class=\"language-text\">.</code> 으로 변환하고,<br>\n<code class=\"language-text\">^</code> 메타문자와 <code class=\"language-text\">$</code> 메타문자를 사용하여 시작 부분과 끝 부분 모두 매칭하는지 확인할 <strong>정규 표현식</strong> 패턴 생성</li>\n<li><strong>중복 제거</strong><br>\n순열의 문자열이 다 일치하는 경우에는 중복 제거를 위해 <code class=\"language-text\">sorted</code>를 사용해서 우선 정렬하고,<br>\n<strong>set</strong> 처리를 위해 <strong>tuple</strong>로 변환 후 <code class=\"language-text\">result</code> 리스트에 <strong>append</strong> 해준다.<br>\n이 후, <strong>set</strong>으로 변환해 중복을 제거해주고 길이 반환</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> re\n<span class=\"token keyword\">from</span> itertools <span class=\"token keyword\">import</span> permutations\n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>user_id<span class=\"token punctuation\">,</span> banned_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    result <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    order_list <span class=\"token operator\">=</span> permutations<span class=\"token punctuation\">(</span>user_id<span class=\"token punctuation\">,</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>banned_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 순열 생성</span>\n    <span class=\"token keyword\">for</span> order <span class=\"token keyword\">in</span> order_list<span class=\"token punctuation\">:</span>\n        check <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n        <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> <span class=\"token builtin\">id</span> <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>banned_id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 정규 표현식 사용 (^: 시작 부분 매치 확인, $: 끝 부분 매치 확인)</span>\n            pattern <span class=\"token operator\">=</span> re<span class=\"token punctuation\">.</span><span class=\"token builtin\">compile</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"^</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span><span class=\"token builtin\">id</span><span class=\"token punctuation\">.</span>replace<span class=\"token punctuation\">(</span><span class=\"token string\">'*'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">$\"</span></span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># '*'는 '.'으로 치환</span>\n            <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> pattern<span class=\"token punctuation\">.</span>match<span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> check <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span>\n        <span class=\"token comment\"># 전부 다 일치하는 경우</span>\n        <span class=\"token keyword\">if</span> check<span class=\"token punctuation\">:</span>\n            order <span class=\"token operator\">=</span> <span class=\"token builtin\">sorted</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 중복 제거를 위해 우선 정렬</span>\n            result<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token builtin\">tuple</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># set 처리하기 위해 tuple로 변환 후 append</span>\n    <span class=\"token keyword\">return</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># set 이용해서 중복 제거</span></code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p>처음 보자마자 <strong>순열</strong>을 생성해서 경우의 수를 비교해야겠다고 생각했고, <strong>정규 표현식</strong>을 공부한 후 <strong>정규 표현식</strong> 활용해서 풀었다.<br>\n당연히 <strong>순열</strong> 문제로 생각했는데 거의 다 <strong>DFS</strong>나 <strong>비트마스크</strong>로 풀었다는게 신기,,<br>\n중복 제거를 위해 <strong>list</strong>로 변환해 <strong>정렬</strong>하고, <strong>tuple</strong>로 변환해서 <strong>append</strong>하고, 다시 <strong>set</strong> 처리하는 과정에서 실행 시간이 오래 걸린 것 같다…</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2019 카카오 개발자 겨울 인턴십]</a></li>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\">제한사항</a></li>\n<li><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\">입출력 예</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","frontmatter":{"date":"May 16, 2022","title":"[Programmers] 64064번: 불량 사용자 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-64064/"}},"prev":{"id":"4654bbac-d641-58a5-8275-b2f97eb19271","html":"<h2 id=\"2019-카카오-개발자-겨울-인턴십\" style=\"position:relative;\"><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2019 카카오 개발자 겨울 인턴십 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[2019 카카오 개발자 겨울 인턴십]</h2>\n<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제</h2>\n<p><a href=\"https://programmers.co.kr/learn/courses/30/lessons/64062\">https://programmers.co.kr/learn/courses/30/lessons/64062</a></p>\n<p>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</p>\n<p>카카오 초등학교의 “니니즈 친구들”이 “라이언” 선생님과 함께 가을 소풍을 가는 중에 징검다리가 있는 개울을 만나서 건너편으로 건너려고 합니다. “라이언” 선생님은 “니니즈 친구들”이 무사히 징검다리를 건널 수 있도록 다음과 같이 규칙을 만들었습니다.</p>\n<ul>\n<li>징검다리는 일렬로 놓여 있고 각 징검다리의 디딤돌에는 모두 숫자가 적혀 있으며 디딤돌의 숫자는 한 번 밟을 때마다 1씩 줄어듭니다.</li>\n<li>디딤돌의 숫자가 0이 되면 더 이상 밟을 수 없으며 이때는 그 다음 디딤돌로 한번에 여러 칸을 건너 뛸 수 있습니다.</li>\n<li>단, 다음으로 밟을 수 있는 디딤돌이 여러 개인 경우 무조건 가장 가까운 디딤돌로만 건너뛸 수 있습니다.</li>\n</ul>\n<p>“니니즈 친구들”은 개울의 왼쪽에 있으며, 개울의 오른쪽 건너편에 도착해야 징검다리를 건넌 것으로 인정합니다.<br>\n“니니즈 친구들”은 한 번에 한 명씩 징검다리를 건너야 하며, 한 친구가 징검다리를 모두 건넌 후에 그 다음 친구가 건너기 시작합니다.</p>\n<p>디딤돌에 적힌 숫자가 순서대로 담긴 배열 stones와 한 번에 건너뛸 수 있는 디딤돌의 최대 칸수 k가 매개변수로 주어질 때, 최대 몇 명까지 징검다리를 건널 수 있는지 return 하도록 solution 함수를 완성해주세요.</p>\n<hr>\n<h2 id=\"제한사항\" style=\"position:relative;\"><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\" aria-label=\"제한사항 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>제한사항</h2>\n<ul>\n<li>징검다리를 건너야 하는 니니즈 친구들의 수는 무제한 이라고 간주합니다.</li>\n<li>stones 배열의 크기는 1 이상 200,000 이하입니다.</li>\n<li>stones 배열 각 원소들의 값은 1 이상 200,000,000 이하인 자연수입니다.</li>\n<li>k는 1 이상 stones의 길이 이하인 자연수입니다.</li>\n</ul>\n<hr>\n<h2 id=\"입출력-예\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\" aria-label=\"입출력 예 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>입출력 예</h2>\n<table>\n<thead>\n<tr>\n<th>stones</th>\n<th>k</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>[2, 4, 5, 3, 2, 1, 4, 2, 5, 1]</td>\n<td>3</td>\n<td>3</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔍 Algorithm</h2>\n<p><strong>Binary Search</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># Binary Search</span>\n    <span class=\"token keyword\">while</span> start <span class=\"token operator\">&lt;=</span> end<span class=\"token punctuation\">:</span>\n        mid <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>start <span class=\"token operator\">+</span> end<span class=\"token punctuation\">)</span> <span class=\"token operator\">//</span> <span class=\"token number\">2</span>\n        count <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token comment\"># 디딤돌 확인</span>\n        <span class=\"token keyword\">for</span> s <span class=\"token keyword\">in</span> stones<span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 밟을 수 있는 경우</span>\n            <span class=\"token keyword\">if</span> s <span class=\"token operator\">>=</span> mid<span class=\"token punctuation\">:</span>\n                count <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n                <span class=\"token keyword\">continue</span>\n            <span class=\"token comment\"># 밟을 수 없는 경우</span>\n            count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n            <span class=\"token comment\"># 건너뛰어야 하는 디딤돌이 k인 경우 (징검다리를 건널 수 없는 경우)</span>\n            <span class=\"token keyword\">if</span> count <span class=\"token operator\">==</span> k<span class=\"token punctuation\">:</span>\n                end <span class=\"token operator\">=</span> mid <span class=\"token operator\">-</span> <span class=\"token number\">1</span>\n                <span class=\"token keyword\">break</span>\n        <span class=\"token comment\"># 징검다리를 건널 수 있는 경우</span>\n        <span class=\"token keyword\">if</span> count <span class=\"token operator\">&lt;</span> k<span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">=</span> mid\n            start <span class=\"token operator\">=</span> mid <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n<ul>\n<li><strong>Parametric Search</strong><br>\n<code class=\"language-text\">징검다리를 건널 수 있는 최대 인원수</code>를 찾는 <strong>최적화 문제</strong>를 <code class=\"language-text\">x명의 인원이 건널 수 있는지</code> 찾는 <strong>결정 문제</strong>로 바꿔서 해결</li>\n<li><strong>Binary Search</strong><br>\n<code class=\"language-text\">x영의 인원이 건널 수 있는지</code> 찾기 위해서 <code class=\"language-text\">x</code>를 <strong>Binary Search</strong><br>\n<code class=\"language-text\">count</code>를 이용해서 한번에 건너뛰어야 하는 디딤돌 수 체크<br>\n<strong>밟을 수 있는 경우</strong>에는 <code class=\"language-text\">count</code>를 <strong>0</strong>으로 초기화<br>\n<strong>밟을 수 없는 경우</strong>에는 <code class=\"language-text\">count</code>를 하나씩 늘려주고, <code class=\"language-text\">count == k</code>가 되면 징검다리를 건널 수 없으므로 <code class=\"language-text\">end</code>를 <code class=\"language-text\">mid</code> 앞으로 옮겨주고 다시 <strong>Binary Search</strong><br>\n징검다리를 끝까지 건널 수 있는 경우에는 현재 <code class=\"language-text\">mid</code> 값을 정답으로 우선 저장해두고, <code class=\"language-text\">start</code>를 <code class=\"language-text\">mid</code> 뒤로 옮겨주고 다시 <strong>Binary Search</strong></li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>stones<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n    start<span class=\"token punctuation\">,</span> end <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">max</span><span class=\"token punctuation\">(</span>stones<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># Binary Search</span>\n    <span class=\"token keyword\">while</span> start <span class=\"token operator\">&lt;=</span> end<span class=\"token punctuation\">:</span>\n        mid <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>start <span class=\"token operator\">+</span> end<span class=\"token punctuation\">)</span> <span class=\"token operator\">//</span> <span class=\"token number\">2</span>\n        count <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token comment\"># 디딤돌 확인</span>\n        <span class=\"token keyword\">for</span> s <span class=\"token keyword\">in</span> stones<span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 밟을 수 있는 경우</span>\n            <span class=\"token keyword\">if</span> s <span class=\"token operator\">>=</span> mid<span class=\"token punctuation\">:</span>\n                count <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n                <span class=\"token keyword\">continue</span>\n            <span class=\"token comment\"># 밟을 수 없는 경우</span>\n            count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n            <span class=\"token comment\"># 건너뛰어야 하는 디딤돌이 k인 경우 (징검다리를 건널 수 없는 경우)</span>\n            <span class=\"token keyword\">if</span> count <span class=\"token operator\">==</span> k<span class=\"token punctuation\">:</span>\n                end <span class=\"token operator\">=</span> mid <span class=\"token operator\">-</span> <span class=\"token number\">1</span>\n                <span class=\"token keyword\">break</span>\n        <span class=\"token comment\"># 징검다리를 건널 수 있는 경우</span>\n        <span class=\"token keyword\">if</span> count <span class=\"token operator\">&lt;</span> k<span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">=</span> mid\n            start <span class=\"token operator\">=</span> mid <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p>처음에는 <strong>Binary Search</strong>로 풀어야겠다는 생각을 못하고 <strong>Union-Find</strong>나 다른 알고리즘을 생각하고 있었는데 입력도 터무니없이 크고, 저번에 풀었던 <strong>Parametric Search</strong> 문제가 생각나서 <strong>Parametric Search</strong> 기법을 사용해서 풀었다. 그러고 다시 보니까 전형적인 <strong>Binary Search</strong> 문제.<br>\n다음부터 입력이 200,000,000처럼 터무니없이 크면 <strong>Binary Search</strong> 생각부터 하자!</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2019 카카오 개발자 겨울 인턴십]</a></li>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\">제한사항</a></li>\n<li><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\">입출력 예</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","frontmatter":{"date":"May 16, 2022","title":"[Programmers] 64062번: 징검다리 건너기 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-64062/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/pg-64063/","nextSlug":"/pg-64064/","prevSlug":"/pg-64062/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}