{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/pg-81305/",
    "result": {"data":{"cur":{"id":"ca0399c7-33c0-5fe9-aaa7-b4ce918900ac","html":"<h2 id=\"2021-카카오-채용연계형-인턴십\" style=\"position:relative;\"><a href=\"#2021-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%B1%84%EC%9A%A9%EC%97%B0%EA%B3%84%ED%98%95-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2021 카카오 채용연계형 인턴십 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>[2021 카카오 채용연계형 인턴십]</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/81305\">https://programmers.co.kr/learn/courses/30/lessons/81305</a></p>\n<p>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</p>\n<p>카카오 인턴을 선발하는 코딩 테스트 시험장이 하나의 이진 트리 형태로 연결되어 있습니다. 아래 그림은 12개의 시험장이 연결된 예시입니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 87.77777777777777%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB9klEQVQ4y41S207bQBD1/4sf4KHlIZDyQEMQaRQKFDUCEUQuEiBqo4rGjZ3EyfqWdRJ7Z3en2JuaktRq58H27vjMOWdmNCwIzvlP2xZSYnFoRYmBab7f2iKEIKIsKFEIngyHP5rNwPf/FyyyQEQA8DwvXC7932AhxGYJ7a9uCSGMMUScz+ee5/3Ds6r6Tddv221KaRzH+WUURZ7nfb28JK67ZuGVWUjZbja/1OtJxql+Us/xZPK5XP5uGIWyJaJjWWPb3vSWMDZ4fAw39Gt5qxCRuO7YcfJj7ggArNGIRlGhbM657/uz2SxJkjWGOI5Vap1ZVep0ux8rFQDgnDdOTs7Oz3OS6tFR6+YGEafT6V65bFlWntIwe91dXFzv7iZCcMRevd6pVHhWO6C022gYDw8p2HVvazXz+Xmd2XWckWmqnvPlEhYLdS+ECAhJsskJKe1+f545fwMOwnCqxvjWFWMsCAL1DYw5kwml9FU2cD5fLIIgoJTOKAXO00yWAwAapaGqUJqe0o4ypsahXV9dvdveVstYq1YP9/fzUR0eHHw6Pla0H0qls9PT1DkhpZ0dQ9dTsPX01O90lkkiEAf392arlfC0WbMoGhqGbZpSypDSoa4Psz77YWj1eiPbXslmACudnLM/1oMBMIDVkmVjVKIYT+MF/AvAAgdN6LS7/QAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"img1.png\"\n        title=\"img1.png\"\n        src=\"/static/af7da8eb79cf5589e1b0551e39bad05b/37523/img1.png\"\n        srcset=\"/static/af7da8eb79cf5589e1b0551e39bad05b/e9ff0/img1.png 180w,\n/static/af7da8eb79cf5589e1b0551e39bad05b/f21e7/img1.png 360w,\n/static/af7da8eb79cf5589e1b0551e39bad05b/37523/img1.png 720w,\n/static/af7da8eb79cf5589e1b0551e39bad05b/00d43/img1.png 1000w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<ol>\n<li>하나의 노드는 하나의 시험장을 나타냅니다.</li>\n<li>검은 바탕의 흰 숫자는 해당 시험장의 고유 번호(ID)를 나타냅니다.<br>\n2-1. 시험장이 n개 있다면, 시험장의 고유 번호는 0부터 n-1까지 부여됩니다.</li>\n<li>노드 안의 빨간 숫자는, 해당 시험장의 응시자 수를 나타냅니다.<br>\n3-1. 위의 그림에서, 9번 시험장에는 10명, 4번 시험장에는 8명, 6번 시험장에는 20명의 응시자가 시험을 볼 예정입니다.</li>\n<li>노드 사이의 간선은 해당 시험장이 연결되어 있음을 의미합니다.<br>\n4-1. 위의 그림에서, 9번 시험장은 7번 시험장과, 7번 시험장은 6번 시험장과 연결되어 있습니다.</li>\n</ol>\n<p>코딩 테스트를 총괄하는 무지는 안정적인 시험을 위해, 시험장에서 오는 트래픽을 <code class=\"language-text\">k</code>개의 그룹으로 나누어 각 그룹별 서버로 분산시키기로 하였습니다. 시험장 사이를 연결한 간선들 중 <code class=\"language-text\">k-1</code>개를 끊어서 시험장을 <code class=\"language-text\">k</code>개의 그룹으로 나눌 계획입니다. 이때, 그룹별 최대 트래픽을 최소화하기 위하여 가장 큰 그룹의 인원을 최소화시켜야 합니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 87.77777777777777%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB6klEQVQ4y5VTTW/TQBDN/79z5cqhEj20SC0CUUEhUKJIAUKlOiDn03Fi7669u7b3awattzEhbQSsLHmsfW/em/FMD48cAIc8RQA8fnqPMxGBzOHyCQoSMv0HGRE1WW8/vAXJ/pUMzj+IqJShlIi6JpS2XEDnHqboPfCLStvBmNaNRkQpJSHkbzW3SfkE85FjPJOV9jKtlBCCUYrxDUryG3qgDIC0X6WvuNa2w0DLV2Xmrk8wnTyuDC22THKW0O6zS4poNne3htOjZO3w54yl6abt3H5vwBqTrBMhROfl0LbS9i4uMlIarQ4U6qahlJZleagcHA7LH6fLa2h0beXiTb19f+/d332/KKKBQyzI1g6fY7HqiumF19fJ537/rGnB2cs4O9v1RgszfO2Wtx5fUXVzAVm8p9ySSbZN5rP7Oak1VJ1zKPPcqibEq+lUVfLQNiuKbZb/8RODsNaUsS5epxvOede2nkUnbcMo42XJa2lCoaGlYCspAhqd8ZEQRVGA1WGMex/z8dPoXCuNDl/E705nV2EfPXt0LkaXNugOTvi3K0DkLHOfnuEm8uRFNo2n4xqNQ5wvo+lkpIJ3Ld1iAvnCl6KEm0dAV/6iKW30BVnS2gan0fkaAIyPYX86wJldbMDZ3YZZv2SIvwCdgBYEiLCljwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"img2.png\"\n        title=\"img2.png\"\n        src=\"/static/f910d9e729571808714f9cb6fda47c4a/37523/img2.png\"\n        srcset=\"/static/f910d9e729571808714f9cb6fda47c4a/e9ff0/img2.png 180w,\n/static/f910d9e729571808714f9cb6fda47c4a/f21e7/img2.png 360w,\n/static/f910d9e729571808714f9cb6fda47c4a/37523/img2.png 720w,\n/static/f910d9e729571808714f9cb6fda47c4a/00d43/img2.png 1000w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>위의 그림에서 7번과 6번 시험장을 잇는 간선을 끊고, 9번과 7번 시험장을 잇는 간선을 끊는다면, 전체 시험장은 3개의 그룹으로 나누어집니다.</p>\n<ul>\n<li>주황색 노드로 표시된 A그룹의 인원은 35명(10+8+5+6+1+1+4)</li>\n<li>보라색 노드로 표시된 B그룹의 인원은 37명(7+30)</li>\n<li>녹색 노드로 표시된 C그룹의 인원은 40명(20+8+12)</li>\n</ul>\n<p>즉, 인원이 가장 많은 그룹은 40명입니다. 다른 어떤 방법으로 시험장을 3개의 그룹으로 나눈다고 해도, 인원이 가장 많은 그룹의 인원이 40명 미만이 되도록 나눌 수는 없습니다.</p>\n<p>나눌 그룹의 수를 나타내는 정수 <code class=\"language-text\">k</code>, 각 시험장의 응시자 수를 나타내는 1차원 정수 배열 <code class=\"language-text\">num</code>, 시험장의 연결 상태를 나타내는 2차원 정수 배열 <code class=\"language-text\">links</code>가 매개변수로 주어집니다. 인원이 가장 많은 그룹의 인원이 최소화되도록 <code class=\"language-text\">k</code>개의 그룹으로 나누었을 때, 최소화된 최대 그룹의 인원을 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>1 ≤ <code class=\"language-text\">k</code> ≤ 10,000</li>\n<li><code class=\"language-text\">k</code> ≤ <code class=\"language-text\">num</code>의 길이 ≤ 10,000\n<ul>\n<li><code class=\"language-text\">num[i]</code>에는 i번 시험장의 응시자 수가 담겨있습니다.</li>\n<li>1 ≤ <code class=\"language-text\">num</code>의 원소 ≤ 10,000</li>\n</ul>\n</li>\n<li><code class=\"language-text\">links</code>의 길이 = <code class=\"language-text\">num</code>의 길이\n<ul>\n<li><code class=\"language-text\">links</code>의 i번째 행은 i번 노드(시험장)의 [왼쪽 자식 노드 번호, 오른쪽 자식 노드 번호]입니다.\n<ul>\n<li>해당 위치에 자식 노드가 없는 경우 <code class=\"language-text\">-1</code>이 담겨있습니다.</li>\n<li>잘못된 노드 번호나, 하나의 이진 트리 구조가 아닌 입력은 주어지지 않습니다.</li>\n</ul>\n</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>num</th>\n<th>links</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>3</td>\n<td>[12, 30, 1, 8, 8, 6, 20, 7, 5, 10, 4, 1]</td>\n<td>[[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 5], [2, 10], [3, 0], [6, 1], [11, -1], [7, 4], [-1, -1], [-1, -1]]</td>\n<td>40</td>\n</tr>\n<tr>\n<td>1</td>\n<td>[6, 9, 7, 5]</td>\n<td>[[-1, -1], [-1, -1], [-1, 0], [2, 1]]</td>\n<td>27</td>\n</tr>\n<tr>\n<td>2</td>\n<td>[6, 9, 7, 5]</td>\n<td>[[-1, -1], [-1, -1], [-1, 0], [2, 1]]</td>\n<td>14</td>\n</tr>\n<tr>\n<td>4</td>\n<td>[6, 9, 7, 5]</td>\n<td>[[-1, -1], [-1, -1], [-1, 0], [2, 1]]</td>\n<td>9</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>DFS, Parametric 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\"># Parametric 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        dfs<span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">,</span> mid<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>\n        count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">if</span> count <span class=\"token operator\">&lt;=</span> k<span class=\"token punctuation\">:</span>\n            end <span class=\"token operator\">=</span> mid\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            start <span class=\"token operator\">=</span> mid <span class=\"token operator\">+</span> <span class=\"token number\">1</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">최소화된 최대 그룹의 인원</code>을 구하는 <strong>최적화 문제</strong>를 <code class=\"language-text\">각 그룹을 x명으로 제한할 때 k개 이하의 그룹 수가 되는지</code> 판단하는 <strong>결정 문제</strong>로 바꿔서 해결</li>\n<li>몇 명으로 제한할지는 <strong>이분 탐색</strong>처럼 정하고, 그 때 몇 개 이하의 그룹 수가 되는지는 <strong>DFS</strong> 탐색 하면서 확인</li>\n</ul>\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\">dfs</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">global</span> count\n    left_value<span class=\"token punctuation\">,</span> right_value <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">if</span> left<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span> \n        left_value <span class=\"token operator\">=</span> dfs<span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>    <span class=\"token comment\"># 왼쪽 자식 노드에서 오는 값</span>\n    <span class=\"token keyword\">if</span> right<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        right_value <span class=\"token operator\">=</span> dfs<span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 오른쪽 자식 노드에서 오는 값</span>\n    <span class=\"token comment\"># 나눌 필요 없는 경우</span>\n    <span class=\"token keyword\">if</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> left_value <span class=\"token operator\">+</span> right_value <span class=\"token operator\">&lt;=</span> limit<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> left_value <span class=\"token operator\">+</span> right_value\n    <span class=\"token comment\"># 자식 노드 중 하나만 나누면 되는 경우</span>\n    <span class=\"token keyword\">if</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>left_value<span class=\"token punctuation\">,</span> right_value<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;=</span> limit<span class=\"token punctuation\">:</span>\n        count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>left_value<span class=\"token punctuation\">,</span> right_value<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># 자식 노드 둘 다 나눠야 하는 경우</span>\n    count <span class=\"token operator\">+=</span> <span class=\"token number\">2</span>\n    <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span></code></pre></div>\n<ul>\n<li>리프에서부터 값을 <code class=\"language-text\">limit</code>를 벗어나지 않게 비교하면서 상위 노드로 올려주고, <code class=\"language-text\">limit</code>를 벗어나면 그룹을 나누어준다.\n<ol>\n<li>다 더해도 <code class=\"language-text\">limit</code>를 넘지 않아서 자식 노드와 그룹 나눌 필요 없는 경우</li>\n<li>자식 노드 중 <strong>min</strong> 값을 더했을 때는 <code class=\"language-text\">limit</code>를 넘지 않아서 하나만 나누면 되는 경우</li>\n<li>자식 노드 둘 다 더할 수 없어서 둘 다 나눠야 하는 경우</li>\n</ol>\n</li>\n<li>이렇게 세가지로 나눠서 탐색하고 그룹 수를 카운트 해준다.</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<span class=\"token keyword\">import</span> sys\nsys<span class=\"token punctuation\">.</span>setrecursionlimit<span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token operator\">**</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span>\n\nleft<span class=\"token punctuation\">,</span> right<span class=\"token punctuation\">,</span> parent <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 punctuation\">,</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span><span class=\"token punctuation\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\ncount <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">dfs</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">global</span> count\n    left_value<span class=\"token punctuation\">,</span> right_value <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">if</span> left<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span> \n        left_value <span class=\"token operator\">=</span> dfs<span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>    <span class=\"token comment\"># 왼쪽 자식 노드에서 오는 값</span>\n    <span class=\"token keyword\">if</span> right<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        right_value <span class=\"token operator\">=</span> dfs<span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> limit<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 오른쪽 자식 노드에서 오는 값</span>\n    <span class=\"token comment\"># 나눌 필요 없는 경우</span>\n    <span class=\"token keyword\">if</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> left_value <span class=\"token operator\">+</span> right_value <span class=\"token operator\">&lt;=</span> limit<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> left_value <span class=\"token operator\">+</span> right_value\n    <span class=\"token comment\"># 자식 노드 중 하나만 나누면 되는 경우</span>\n    <span class=\"token keyword\">if</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>left_value<span class=\"token punctuation\">,</span> right_value<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;=</span> limit<span class=\"token punctuation\">:</span>\n        count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>left_value<span class=\"token punctuation\">,</span> right_value<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># 자식 노드 둘 다 나눠야 하는 경우</span>\n    count <span class=\"token operator\">+=</span> <span class=\"token number\">2</span>\n    <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span>\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> num<span class=\"token punctuation\">,</span> links<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">global</span> count\n    root<span class=\"token punctuation\">,</span> 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>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span> <span class=\"token operator\">**</span> <span class=\"token number\">8</span>\n    <span class=\"token comment\"># 트리 정보 입력</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        left<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> right<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> links<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">if</span> left<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span> parent<span class=\"token punctuation\">[</span>left<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i\n        <span class=\"token keyword\">if</span> right<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span> parent<span class=\"token punctuation\">[</span>right<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i\n    <span class=\"token comment\"># root 값 찾기</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> parent<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span> \n            root <span class=\"token operator\">=</span> i\n            <span class=\"token keyword\">break</span>\n    <span class=\"token comment\"># 이분 탐색</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        dfs<span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">,</span> mid<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span>\n        count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">if</span> count <span class=\"token operator\">&lt;=</span> k<span class=\"token punctuation\">:</span>\n            end <span class=\"token operator\">=</span> mid\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\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> start</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>DFS로 해야 되나,,?? 라는 생각만 들고 감이 안잡혀서 다른 사람들 풀이 보고 이해했다..<br>\n난이도가 그만큼 어려워서인지 풀이도 많지 않았고, 봐도 이해하는데 오래걸렸다.<br>\n<code class=\"language-text\">Parametric Search</code> 라는 알고리즘은 처음 알게 되었고, 이해는 했으니 이제 많이 풀어봐야겠다ㅜ</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2021-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%B1%84%EC%9A%A9%EC%97%B0%EA%B3%84%ED%98%95-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2021 카카오 채용연계형 인턴십]</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":"[2021 카카오 채용연계형 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/81305 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 카카오 인턴을 선발하는 코딩 테스트 시험장이 하나의 이진 트리 형태로 연결되어 있습니다. 아래 그림은 12개의 시험장이 연결된 예시입니다.  하나의 노드는 하나의 시험장을 나타냅니다. 검은 바탕의 흰 숫자는 해당 시험장의 고유 번호(ID)를 나타냅니다. 2-1. 시험장이 n개 있다면, 시험장의 고유 번호는 0부터 n-1까지 부여됩니다. 노드 안의 빨간 숫자는, 해당 시험장의 응시자 수를 나타냅니다. 3-1. 위의 그림에서, 9번 시험장에는 10명, 4번 시험장에는 8명, 6번 시험장에는 20명의 응시자가 시험을 볼 예정입니다. 노드 사이의 간선은 해당 시험장이 연결되어 있음을 의미합니다. 4-1. 위의 그림에서, 9번 시험장은 7번 시험장과, 7번 시험장은 6번 시험장과 …","frontmatter":{"date":"May 09, 2022","title":"[Programmers] 81305번: 시험장 나누기 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-81305/"}},"next":{"id":"b3a311e0-b978-59c5-a6c2-6d8cd6923e5e","html":"<h2 id=\"2021-카카오-채용연계형-인턴십\" style=\"position:relative;\"><a href=\"#2021-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%B1%84%EC%9A%A9%EC%97%B0%EA%B3%84%ED%98%95-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2021 카카오 채용연계형 인턴십 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>[2021 카카오 채용연계형 인턴십]</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/81304\">https://programmers.co.kr/learn/courses/30/lessons/81304</a></p>\n<p>신규 게임 ‘카카오 미로 탈출’이 출시되어, 라이언이 베타테스터로 참가했습니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 92.22222222222223%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAABrklEQVQ4y6VUO27CQBD1mVAaTkCBxAk4A5yDDokOiQPQ0uGGBiFRIBFoaBE4MbGNbfAHf180C+v4B06UaWzPzrx57+2uBQCIogiGYUBRFKiqyr4p4jhGPijH86Zp4nQ6wff9ZE2glyAIsFgsMBqNMJvNCo354APn8zmGwyEjwvMCbz6fz7her9B1vZIhBbEiNZZlsZ4MQ0qS5MlkwooIuAqQ6knueDxm9bZts3wCSH7sdruEaZnsvH+yLEMURVwuFziO8wNIRZqmsaL9fp+R/AzQ8zxWW5Ccl0XsCDgtLw3En0TAdd2CHUK6gRfTrhGDvI/8nfwia8p6hfzk2+2G5XLJGORZ8pAkCavVqlSBkJ8ehiEzmIxOS+frxIwYktyyYULZkeBB0mPaoDCkxeTsveopMEyzcWwb79vt/SADWK/XpSfgKcMM8KNRPRyg9XpQBgPofCNe3CSh7K6y6Y8mrdPBsVaD9PYGs9+/r4fh03teCSg1m/hsNCDV6/jqdv8P6G42+Gi1ILfb8CUpI/nXgGl/IsOANZ3CFkXEqf/e3xnyzfE8hLKM4HhkUqsAvwHZ/3Jyb4HMtQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Maze.png\"\n        title=\"Maze.png\"\n        src=\"/static/aded4530870dce5c9b2bf2009039a2f1/0b533/Maze.png\"\n        srcset=\"/static/aded4530870dce5c9b2bf2009039a2f1/e9ff0/Maze.png 180w,\n/static/aded4530870dce5c9b2bf2009039a2f1/f21e7/Maze.png 360w,\n/static/aded4530870dce5c9b2bf2009039a2f1/0b533/Maze.png 500w\"\n        sizes=\"(max-width: 500px) 100vw, 500px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>위 예시 그림은 카카오 미로 탈출의 초기 상태를 나타냅니다. 1번부터 3번까지 번호가 붙어있는 3개의 방이 있고, 방과 방 사이를 연결하는 길에는 이동하는데 걸리는 시간이 표시되어 있습니다. 길은 화살표가 가리키는 방향으로만 이동할 수 있습니다. 미로에는 함정이 존재하며, 함정으로 이동하면, 이동한 함정과 연결된 모든 화살표의 방향이 바뀝니다.<br>\n출발지점인 <code class=\"language-text\">1</code>번 방에서 탈출이 가능한 <code class=\"language-text\">3</code>번 방까지 이동해야 합니다. 탈출하는데 걸리는 최소 시간을 구하려고 합니다.</p>\n<ul>\n<li>그림의 원은 방을 나타내며 원 안의 숫자는 방 번호를 나타냅니다.\n<ul>\n<li>방이 <code class=\"language-text\">n</code>개일 때, 방 번호는 1부터 <code class=\"language-text\">n</code>까지 사용됩니다.</li>\n</ul>\n</li>\n<li>화살표에 표시된 숫자는 방과 방 사이를 이동할 때 걸리는 시간을 나타냅니다.\n<ul>\n<li>화살표가 가리키고 있는 방향으로만 이동이 가능합니다. 즉, 위 그림에서 2번 방에서 1번 방으로는 이동할 수 없습니다.</li>\n</ul>\n</li>\n<li>그림에 표시된 빨간색 방인 <code class=\"language-text\">2</code>번 방은 함정입니다.\n<ul>\n<li>함정 방으로 이동하는 순간, 이동한 함정 방과 연결되어있는 모든 길의 방향이 반대가 됩니다.</li>\n<li>위 그림 <code class=\"language-text\">1</code>번 방에서 <code class=\"language-text\">2</code>번 방으로 이동하는 순간 <code class=\"language-text\">1</code>에서 <code class=\"language-text\">2</code>로 이동할 수 있던 길은 <code class=\"language-text\">2</code>에서 <code class=\"language-text\">1</code>로 이동할 수 있는 길로 바뀌고, <code class=\"language-text\">3</code>에서 <code class=\"language-text\">2</code>로 이동할 수 있던 길은 <code class=\"language-text\">2</code>에서 <code class=\"language-text\">3</code>으로 이동할 수 있는 길로 바뀝니다.</li>\n<li>똑같은 함정 방을 두 번째 방문하게 되면 원래 방향의 길로 돌아옵니다. 즉, 여러 번 방문하여 계속 길의 방향을 반대로 뒤집을 수 있습니다.</li>\n</ul>\n</li>\n<li>미로를 탈출하는데 필요한 최단 시간은 다음과 같습니다.\n<ul>\n<li>1→2: 2번 방으로 이동합니다. 이동 시간은 2입니다.</li>\n<li>함정 발동: 2번 방과 연결된 모든 길의 방향이 반대가 됩니다.</li>\n<li>2→3: 3번 방으로 이동합니다. 이동 시간은 3입니다.</li>\n<li>탈출에 성공했습니다. 총 이동시간은 5입니다.</li>\n</ul>\n</li>\n</ul>\n<p>방의 개수를 나타내는 정수 <code class=\"language-text\">n</code>, 출발 방의 번호 <code class=\"language-text\">start</code>, 도착 방의 번호 <code class=\"language-text\">end</code>, 통로와 이동시간을 나타내는 2차원 정수 배열 <code class=\"language-text\">roads</code>, 함정 방의 번호를 담은 정수 배열 <code class=\"language-text\">traps</code>이 매개변수로 주어질 때, 미로를 탈출하는데 필요한 최단 시간을 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>2 ≤ <code class=\"language-text\">n</code> ≤ 1,000</li>\n<li>1 ≤ <code class=\"language-text\">start</code> ≤ <code class=\"language-text\">n</code></li>\n<li>1 ≤ <code class=\"language-text\">end</code> ≤ <code class=\"language-text\">n</code></li>\n<li>1 ≤ <code class=\"language-text\">roads</code>의 행 길이 ≤ 3,000</li>\n<li><code class=\"language-text\">roads</code>의 행은 [P, Q, S]로 이루어져 있습니다.\n<ul>\n<li><code class=\"language-text\">P</code>에서 <code class=\"language-text\">Q</code>로 갈 수 있는 길이 있으며, 길을 따라 이동하는데 <code class=\"language-text\">S</code>만큼 시간이 걸립니다.</li>\n<li>1 ≤ <code class=\"language-text\">P</code> ≤ <code class=\"language-text\">n</code></li>\n<li>1 ≤ <code class=\"language-text\">Q</code> ≤ <code class=\"language-text\">n</code></li>\n<li><code class=\"language-text\">P</code> ≠ <code class=\"language-text\">Q</code></li>\n<li>1 ≤ <code class=\"language-text\">S</code> ≤ 3,000</li>\n<li>서로 다른 두 방 사이에 직접 연결된 길이 여러 개 존재할 수도 있습니다.</li>\n</ul>\n</li>\n<li>0 ≤ <code class=\"language-text\">traps</code>의 길이 ≤ 10\n<ul>\n<li>1 ≤ <code class=\"language-text\">traps</code>의 원소 ≤ <code class=\"language-text\">n</code></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>n</th>\n<th>start</th>\n<th>end</th>\n<th>roads</th>\n<th>traps</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>3</td>\n<td>1</td>\n<td>3</td>\n<td>[[1, 2, 2], [3, 2, 3]]</td>\n<td>[2]</td>\n<td>5</td>\n</tr>\n<tr>\n<td>4</td>\n<td>1</td>\n<td>4</td>\n<td>[[1, 2, 1], [3, 2, 1], [2, 4, 1]]</td>\n<td>[2, 3]</td>\n<td>4</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>Dijkstra, BitMask</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\">graph <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># visited : 활성화 된 함정 노드에 따라 방문했던 노드 표시</span>\n<span class=\"token comment\"># visited[node][활성화 된 함정 상태] (활성화 된 함정 상태는 비트마스크로 표시)</span>\nvisited <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>INF <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token operator\">**</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>traps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\ntraps_dict <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>n<span class=\"token punctuation\">:</span> i <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> n <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>traps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>    <span class=\"token comment\"># 함정 노드: traps 리스트 상 index</span>\n<span class=\"token comment\"># 그래프 정보 입력</span>\n<span class=\"token keyword\">for</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> v <span class=\"token keyword\">in</span> roads<span class=\"token punctuation\">:</span>\n    graph<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># False : 정방향</span>\n    graph<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">,</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># True : 역방향</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">visited</code> : 활성화 된 함정 노드에 따라 방문했던 노드 표시<br>\n<code class=\"language-text\">visited[node][활성화 된 함정 상태]</code> (활성화 된 함정 상태는 <strong>비트마스크</strong>로 표시)</li>\n<li><code class=\"language-text\">traps_dict</code> : (함정노드: traps 리스트 상 index) 형태로 <strong>dictionary</strong> 생성</li>\n<li><code class=\"language-text\">defaultdict</code>로 생성한 <code class=\"language-text\">graph</code>에 정보 입력<br>\n상태가 <strong>False</strong>면 <strong>정방향</strong>, <strong>True</strong>면 <strong>역방향</strong>을 의미</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># 다익스트라 알고리즘</span>\n    h <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    heapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> start<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    visited<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">while</span> h<span class=\"token punctuation\">:</span>\n        cost<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">,</span> state <span class=\"token operator\">=</span> heapq<span class=\"token punctuation\">.</span>heappop<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># end 노드 도착</span>\n        <span class=\"token keyword\">if</span> node <span class=\"token operator\">==</span> end<span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>answer<span class=\"token punctuation\">,</span> cost<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token comment\"># 이미 방문한 값보다 크면 방문 X</span>\n        <span class=\"token keyword\">if</span> cost <span class=\"token operator\">></span> visited<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>state<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token keyword\">for</span> next_node<span class=\"token punctuation\">,</span> next_cost<span class=\"token punctuation\">,</span> direction <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 함정 노드면 비트마스킹</span>\n            cur_trap<span class=\"token punctuation\">,</span> next_trap <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span>\n            <span class=\"token keyword\">if</span> node <span class=\"token keyword\">in</span> traps_dict<span class=\"token punctuation\">:</span>\n                cur_trap <span class=\"token operator\">=</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">(</span>state <span class=\"token operator\">&amp;</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> traps_dict<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> next_node <span class=\"token keyword\">in</span> traps_dict<span class=\"token punctuation\">:</span>\n                next_trap <span class=\"token operator\">=</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">(</span>state <span class=\"token operator\">&amp;</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> traps_dict<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> direction <span class=\"token operator\">!=</span> <span class=\"token punctuation\">(</span>cur_trap <span class=\"token operator\">^</span> next_trap<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># cur_trap, next_trap 상태가 같으면 정방향, 다르면 역방향</span>\n                <span class=\"token keyword\">continue</span>\n            <span class=\"token comment\"># 다음 노드가 함정 노드인지에 따라 상태 변경</span>\n            next_state <span class=\"token operator\">=</span> state\n            <span class=\"token keyword\">if</span> next_node <span class=\"token keyword\">in</span> traps_dict<span class=\"token punctuation\">:</span>\n                next_state <span class=\"token operator\">=</span> state <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> traps_dict<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token comment\"># 다음 cost 계산하고, 다음 상태의 cost가 이미 방문했고 더 작으면 방문 X</span>\n            next_cost <span class=\"token operator\">=</span> cost <span class=\"token operator\">+</span> next_cost\n            <span class=\"token keyword\">if</span> next_cost <span class=\"token operator\">>=</span> visited<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_state<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">continue</span>\n            visited<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_state<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_cost\n            heapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>next_cost<span class=\"token punctuation\">,</span> next_node<span class=\"token punctuation\">,</span> next_state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n<ul>\n<li><code class=\"language-text\">end</code> 노드 도착<br>\n<code class=\"language-text\">answer</code>에 <code class=\"language-text\">answer</code>와 <code class=\"language-text\">cost</code> 중 <strong>최솟값</strong> 저장하고 <strong>heap</strong>에 값이 남아있을 수도 있으니 <strong>continue</strong> 해서 계속 진행</li>\n<li>이미 방문한 값보다 크면 방문 X</li>\n<li>함정 노드면 <strong>비트마스킹</strong><br>\n현재 노드와 다음 노드에 대해서 함정 노드인지 확인하고, 함정 노드면 비트마스킹 한 값과 현재 상태(현재 활성화 함정 상태)를 <code class=\"language-text\">&amp;</code> 비트 연산하여 저장<br>\n비트 연산한 값 <code class=\"language-text\">cur_trap</code>, <code class=\"language-text\">next_trap</code>의 값이 같으면 <strong>정방향</strong>, 다르면 <strong>역방향</strong></li>\n<li>다음 노드가 함정 노드인지에 따라 상태 변경<br>\n다음 노드가 함정 노드면 현재 상태와 비트 연산하여 다음 상태 변경</li>\n<li>다음 cost 계산하고, 다음 상태의 cost가 이미 방문했고 더 작으면 방문 X</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> heapq<span class=\"token punctuation\">,</span> sys\n<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>n<span class=\"token punctuation\">,</span> start<span class=\"token punctuation\">,</span> end<span class=\"token punctuation\">,</span> roads<span class=\"token punctuation\">,</span> traps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    INF <span class=\"token operator\">=</span> sys<span class=\"token punctuation\">.</span>maxsize\n    answer <span class=\"token operator\">=</span> INF\n    graph <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># visited : 활성화 된 함정 노드에 따라 방문했던 노드 표시</span>\n    <span class=\"token comment\"># visited[node][활성화 된 함정 상태] (활성화 된 함정 상태는 비트마스크로 표시)</span>\n    visited <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>INF <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token operator\">**</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>traps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    traps_dict <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>n<span class=\"token punctuation\">:</span> i <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> n <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>traps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>    <span class=\"token comment\"># 함정 노드: traps 리스트 상 index</span>\n    <span class=\"token comment\"># 그래프 정보 입력</span>\n    <span class=\"token keyword\">for</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> v <span class=\"token keyword\">in</span> roads<span class=\"token punctuation\">:</span>\n        graph<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># False : 정방향</span>\n        graph<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">,</span> v<span class=\"token punctuation\">,</span> <span class=\"token boolean\">True</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># True : 역방향</span>\n    <span class=\"token comment\"># 다익스트라 알고리즘</span>\n    h <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    heapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> start<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    visited<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">while</span> h<span class=\"token punctuation\">:</span>\n        cost<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">,</span> state <span class=\"token operator\">=</span> heapq<span class=\"token punctuation\">.</span>heappop<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># end 노드 도착</span>\n        <span class=\"token keyword\">if</span> node <span class=\"token operator\">==</span> end<span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>answer<span class=\"token punctuation\">,</span> cost<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token comment\"># 이미 방문한 값보다 크면 방문 X</span>\n        <span class=\"token keyword\">if</span> cost <span class=\"token operator\">></span> visited<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>state<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token keyword\">for</span> next_node<span class=\"token punctuation\">,</span> next_cost<span class=\"token punctuation\">,</span> direction <span class=\"token keyword\">in</span> graph<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 함정 노드면 비트마스킹</span>\n            cur_trap<span class=\"token punctuation\">,</span> next_trap <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">False</span>\n            <span class=\"token keyword\">if</span> node <span class=\"token keyword\">in</span> traps_dict<span class=\"token punctuation\">:</span>\n                cur_trap <span class=\"token operator\">=</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">(</span>state <span class=\"token operator\">&amp;</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> traps_dict<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> next_node <span class=\"token keyword\">in</span> traps_dict<span class=\"token punctuation\">:</span>\n                next_trap <span class=\"token operator\">=</span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">(</span>state <span class=\"token operator\">&amp;</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> traps_dict<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> direction <span class=\"token operator\">!=</span> <span class=\"token punctuation\">(</span>cur_trap <span class=\"token operator\">^</span> next_trap<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># cur_trap, next_trap 상태가 같으면 정방향, 다르면 역방향</span>\n                <span class=\"token keyword\">continue</span>\n            <span class=\"token comment\"># 다음 노드가 함정 노드인지에 따라 상태 변경</span>\n            next_state <span class=\"token operator\">=</span> state\n            <span class=\"token keyword\">if</span> next_node <span class=\"token keyword\">in</span> traps_dict<span class=\"token punctuation\">:</span>\n                next_state <span class=\"token operator\">=</span> state <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> traps_dict<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n            <span class=\"token comment\"># 다음 cost 계산하고, 다음 상태의 cost가 이미 방문했고 더 작으면 방문 X</span>\n            next_cost <span class=\"token operator\">=</span> cost <span class=\"token operator\">+</span> next_cost\n            <span class=\"token keyword\">if</span> next_cost <span class=\"token operator\">>=</span> visited<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_state<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">continue</span>\n            visited<span class=\"token punctuation\">[</span>next_node<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_state<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_cost\n            heapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>next_cost<span class=\"token punctuation\">,</span> next_node<span class=\"token punctuation\">,</span> next_state<span class=\"token punctuation\">)</span><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시간을 많이 투자했는데도 해결이 안돼서 다른 풀이를 참고했고, 비트마스크를 사용해서 푸는 방법을 찾을 수 있었다.<br>\n풀이를 보고도 이해해서 다시 코드를 짜는데 시간이 많이 걸렸고, 비트마스크 방식에 대해 더 자세히 알아봐야겠다..<br>\n카카오 문제들이 계속해서 4번부터 어려웠지만 이번 문제는 진짜 어려웠고 이해하는데 너무 오래걸렸다..</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2021-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%B1%84%EC%9A%A9%EC%97%B0%EA%B3%84%ED%98%95-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2021 카카오 채용연계형 인턴십]</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 09, 2022","title":"[Programmers] 81304번: 미로 탈출 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-81304/"}},"prev":{"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/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/pg-81305/","nextSlug":"/pg-81304/","prevSlug":"/pg-64064/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}