{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/pg-81303/",
    "result": {"data":{"cur":{"id":"3a19a811-d48d-5260-be1e-1f977730d334","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/81303\">https://programmers.co.kr/learn/courses/30/lessons/81303</a></p>\n<p>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</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: 250px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 178.88888888888889%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAkCAYAAACJ8xqgAAAACXBIWXMAAAuJAAALiQE3ycutAAAGFUlEQVRIx22WaW8byRGG57flQwzDm8Sy17sJNgGy9gL5SfmaAAE2X9Z7Zdc6nPiQGFmHJVKUKIrkHJwZcu57eFN6gm4qEiltA42ufqu6yHq7umqUSs2g66V0/QLdTTG8TK5dN+U/H1U+Nm10J6Zth3Jq/YSun2MGBZ1eJLGWFUr7N0cqihvkwIz3797SbjU5Oz2heX6GGEY/Ji9HLI8sTagdH3Gw9wEu5yu6jhWiOH4mN6f1E5yeLZ3qmnrjMLvjcDYdo6sdqsdHXM1n9x3u1rv0ohw7LDGDfDH9nF6Y8/ZYo9ruY/kZupPI2fUzrLCgF5UYboLuJmhOLH28q2ooe2cm/aiQPJnCOMil7MQF76s6J6ojnUuevVTaCGeW/OFMYsKxK+xrOkrfS2/5SWKiwL/Z673oHodlnrG/t0urec5kNLwTcoDSW3KYJBGe5946FBwOxiuHJpMR/b5NGPqMx6sOxY0ru0caVi9GNXwMK6Jrx6i6j92LebPX5vjMwrQiNCOQ0zAjrH6KaScYZigxcbbXi3m730Y5vehTlCPCuCDJhiTpQMplOebjmYVqhuT5kCgpiZNSrmk2knZRvMDCuGRQjjk8M1Esd4nDPKMsy5u9akckxWpYYlSrx1iWdQ+/MAMUZ4nD2XjI5fSWs24/orxzKWIEbp/JsLyHq3aA8vpQp2HFVLWAejeibkRSblgJ//rQZrtucWZG1PSAmh5SEzo75bQbS1lgwv7cTni110F59tLh8eaYtVcla5tjnmyOefyq5OnWmAdfW3zybciTzRFrrwasrQ+kfm1jxNr6kLWNocTE2d9tTvjiGwvli58TPtuBP+zA4x9DHv8Q8Huxr8Bvvgt5sjGU+8+34dmbGQ/+XudXf/0vD/5W5+E/mgvdO3hWgT//FKB8/nPK2jZ8ugOPvg/45MeYp9f7h99G/HZ9xKfb8PQ9PHkLj36I+PXXGg+/6fPoe1/iT9/B4x34k3D44qXJ862C5+sJzzcznm9kfLme8NXrgs/+qfPH7xxebOUL/UbKi62Cr/494MXrUsoCE7ovtwr+8lJHqZ9b5GlJEKQkcU4SF1IuspLDukFHd8mSgjBIiaKMNCmv7XLiKCMKM2lfZiUHdX01D4PAx3XdO3l4mzbz+ZxKpUKlskPtpEaj0VhJm5bIw+XiUBYZeZauvOW7xSHwXTy3T5bG5FmyWhzEW/5QM7C9FM0O6fZjuk4iZVE03n5UqV70sETdsyOMXozt5XJabobppLIiaXZE389491FFOWrYROlAAn5c4kellAW2e2JwrnsEcYkTZLhhjhsW12uOFxUSF/ZxtrBX7CUOnX4P3/du9lovIl3i8HI+o9NucXJS42B/b6XUyfJl/QKHw7K42f9SkwoDT3IoeUzi+xyKuIXQ0DxaVkTLDDnTPDp2xMaHFh9OTdpWKENvGj5tS7TOmE4vlvbnhkdD92RGbO23UE47DuVoQixqYT6U5UrIg9FE9mQRdjEYE+fX+nwo5Sgtb7AoGzAcTzk8t1EsJ1nhsNezl/IwlAdW+nKWsrOzzfHxEZd3+rLMw97SpQzKgiLPVi4lK+7WwysCz71uZlf3L+X1fpuG4cv+e6p7nOoL+bzr81OlyXZN50z3qHUcOeuqS6MbcmYEnKiuxKptR9q/2m2itLsBl1dXDEZTxtM5k9lcygI7VV36QcZsfik5Gk1mDMcThqMJk9ktJuzFfz3pOCjmEoddw8Aw9JVPC5Gwi0ivbt77xvo6hwcHjIbDa9VCd9H1Vx0WRU6aJqsO71zKZDLBskzCMOTy8vK+w+39Dpru02w5dDQfVQ+krBsBW5Um+1UDVfO5aLtcdFw6WkDXStC7EW11gTfbC/vXuxcoqhnIcMbjKZPpjMlkJmWBNTQXN8zkP5H4ZEpRDMiLkqIcUJZDeWYk7MUXnCo47N8+H1ELHcdZSoNQJu3/x3Q65fDwUNbE7e1t6vX64o1fh94UIS8n9nw+42opWUVip3ca/Wg0kPk6GBRMxqM7jd5H2T/pys+NC82jbQRyClkzQ3aONI7PbTrdgAvdo2X4dMwQ1YzkKlKupftSJ+wrVZ3/ASFIWmPtX+tfAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"table_1.png\"\n        title=\"table_1.png\"\n        src=\"/static/a6719bf5617130e4d1d4dc6ac348a58e/63868/table_1.png\"\n        srcset=\"/static/a6719bf5617130e4d1d4dc6ac348a58e/e9ff0/table_1.png 180w,\n/static/a6719bf5617130e4d1d4dc6ac348a58e/63868/table_1.png 250w\"\n        sizes=\"(max-width: 250px) 100vw, 250px\"\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>위 그림에서 파란색으로 칠해진 칸은 현재 <strong>선택된 행</strong>을 나타냅니다. 단, 한 번에 한 행만 선택할 수 있으며, 표의 범위(0행 ~ 마지막 행)를 벗어날 수 없습니다. 이때, 다음과 같은 명령어를 이용하여 표를 편집합니다.</p>\n<ul>\n<li><code class=\"language-text\">\"U X\"</code> : 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.</li>\n<li><code class=\"language-text\">\"D X\"</code> : 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.</li>\n<li><code class=\"language-text\">\"C\"</code> : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.</li>\n<li><code class=\"language-text\">\"Z\"</code> : 가장 최근에 삭제된 행을 원래대로 복구합니다. <strong>단, 현재 선택된 행은 바뀌지 않습니다.</strong></li>\n</ul>\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>5 ≤ <code class=\"language-text\">n</code> ≤ 1,000,000</li>\n<li>0 ≤ <code class=\"language-text\">k</code> &#x3C; <code class=\"language-text\">n</code></li>\n<li>1 ≤ <code class=\"language-text\">cmd</code>의 원소 개수 ≤ 200,000\n<ul>\n<li><code class=\"language-text\">cmd</code>의 각 원소는 <code class=\"language-text\">\"U X\"</code>, <code class=\"language-text\">\"D X\"</code>, <code class=\"language-text\">\"C\"</code>, <code class=\"language-text\">\"Z\"</code> 중 하나입니다.</li>\n<li>X는 1 이상 300,000 이하인 자연수이며 0으로 시작하지 않습니다.</li>\n<li>X가 나타내는 자연수에 ’,’ 는 주어지지 않습니다. 예를 들어 123,456의 경우 123456으로 주어집니다.</li>\n<li><code class=\"language-text\">cmd</code>에 등장하는 모든 X들의 값을 합친 결과가 1,000,000 이하인 경우만 입력으로 주어집니다.</li>\n<li>표의 모든 행을 제거하여, 행이 하나도 남지 않는 경우는 입력으로 주어지지 않습니다.</li>\n<li>본문에서 각 행이 제거되고 복구되는 과정을 보다 자연스럽게 보이기 위해 <code class=\"language-text\">\"이름\"</code> 열을 사용하였으나, <code class=\"language-text\">\"이름\"</code>열의 내용이 실제 문제를 푸는 과정에 필요하지는 않습니다. <code class=\"language-text\">\"이름\"</code>열에는 서로 다른 이름들이 중복없이 채워져 있다고 가정하고 문제를 해결해 주세요.</li>\n</ul>\n</li>\n<li>표의 범위를 벗어나는 이동은 입력으로 주어지지 않습니다.</li>\n<li>원래대로 복구할 행이 없을 때(즉, 삭제된 행이 없을 때) “Z”가 명령어로 주어지는 경우는 없습니다.</li>\n<li>정답은 표의 0행부터 n - 1행까지에 해당되는 O, X를 순서대로 이어붙인 문자열 형태로 return 해주세요.</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>k</th>\n<th>cmd</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>8</td>\n<td>2</td>\n<td>[“D 2”,“C”,“U 3”,“C”,“D 4”,“C”,“U 2”,“Z”,“Z”]</td>\n<td>“OOOOXOOO”</td>\n</tr>\n<tr>\n<td>8</td>\n<td>2</td>\n<td>[“D 2”,“C”,“U 3”,“C”,“D 4”,“C”,“U 2”,“Z”,“Z”,“U 1”,“C”]</td>\n<td>“OOXOXOOO”</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>Linked List</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\"># 연결리스트 형태의 dictionary 생성 (첫 행과 마지막 행 연결 부분은 None)</span>\ntable <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>i<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>i<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <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 number\">1</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>\ntable<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\ntable<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 operator\">=</span> <span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">]</span></code></pre></div>\n<ul>\n<li><strong>연결리스트 생성</strong><br>\n<code class=\"language-text\">[prev, next]</code> 연결리스트 형태의 <strong>dictionary</strong> 생성<br>\n첫 행과 마지막 행 연결 부분은 <strong>None</strong>으로 따로 저장</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">if</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'D'</span><span class=\"token punctuation\">:</span>\n  <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 builtin\">int</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    current <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">elif</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'U'</span><span class=\"token punctuation\">:</span>\n  <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 builtin\">int</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    current <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span></code></pre></div>\n<ul>\n<li><strong>명령어가 ‘D’ or ‘U’인 경우</strong><br>\n<code class=\"language-text\">c</code>가 문자열이기 때문에 이동거리는 <strong>slice</strong>를 통해 구하고,<br>\n그 이동거리만큼 반복문으로 연결리스트를 이동한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">elif</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'C'</span><span class=\"token punctuation\">:</span>\n  answer<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">'X'</span>\n  prev<span class=\"token punctuation\">,</span> <span class=\"token builtin\">next</span> <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span>\n  removed<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> current<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># 삭제된 값과 위치 removed에 append</span>\n  <span class=\"token comment\"># 첫 행, 마지막 행 삭제하는 경우 나눠서 처리</span>\n    <span class=\"token keyword\">if</span> prev <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n      table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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 boolean\">None</span>\n      current <span class=\"token operator\">=</span> <span class=\"token builtin\">next</span>\n    <span class=\"token keyword\">elif</span> <span class=\"token builtin\">next</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n      table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span>\n      current <span class=\"token operator\">=</span> prev\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n      table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">next</span>\n      table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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> prev\n      current <span class=\"token operator\">=</span> <span class=\"token builtin\">next</span></code></pre></div>\n<ul>\n<li><strong>명령어가 ‘C’인 경우</strong><br>\n해당 위치에 해당하는 <code class=\"language-text\">answer</code> 값을 <strong>X</strong>로 바꾸고, 삭제할 값과 위치를 <code class=\"language-text\">removed</code> 리스트에 <strong>append</strong><br>\n연결리스트 연결 상태는 첫 행, 마지막 행 삭제하는 경우와 나머지 경우로 나눠서 처리</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">elif</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'Z'</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">(</span>prev<span class=\"token punctuation\">,</span> <span class=\"token builtin\">next</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> i <span class=\"token operator\">=</span> removed<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  answer<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">'O'</span>\n  <span class=\"token comment\"># 첫 행, 마지막 행 복구하는 경우 나눠서 처리</span>\n  <span class=\"token keyword\">if</span> prev <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n    table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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> i\n  <span class=\"token keyword\">elif</span> <span class=\"token builtin\">next</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n    table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i\n  <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n    table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i\n    table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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> i</code></pre></div>\n<ul>\n<li><strong>명령어가 ‘Z’인 경우</strong><br>\n<code class=\"language-text\">removed</code> 리스트에서 <code class=\"language-text\">prev, next, i</code>를 <strong>pop</strong>하고, <code class=\"language-text\">i</code>에 해당하는 <code class=\"language-text\">answer</code> 값을 <strong>O</strong>으로 바꿔준다.<br>\n복구하는 경우도 삭제와 마찬가지로 첫 행, 마지막 행 복구하는 경우와 나머지 경우로 나눠서 처리</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>n<span class=\"token punctuation\">,</span> k<span class=\"token punctuation\">,</span> cmd<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 string\">'O'</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 punctuation\">)</span><span class=\"token punctuation\">]</span>\n    current<span class=\"token punctuation\">,</span> removed <span class=\"token operator\">=</span> k<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token comment\"># 연결리스트 형태의 dictionary 생성 (첫 행과 마지막 행 연결 부분은 None)</span>\n    table <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>i<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>i<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <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 number\">1</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    table<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token boolean\">None</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n    table<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 operator\">=</span> <span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> c <span class=\"token keyword\">in</span> cmd<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'D'</span><span class=\"token punctuation\">:</span>\n            <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 builtin\">int</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                current <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">elif</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'U'</span><span class=\"token punctuation\">:</span>\n            <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 builtin\">int</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                current <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">elif</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'C'</span><span class=\"token punctuation\">:</span>\n            answer<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">'X'</span>\n            prev<span class=\"token punctuation\">,</span> <span class=\"token builtin\">next</span> <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span>\n            removed<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>table<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> current<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>   <span class=\"token comment\"># 삭제된 값과 위치 removed에 append</span>\n            <span class=\"token comment\"># 첫 행, 마지막 행 삭제하는 경우 나눠서 처리</span>\n            <span class=\"token keyword\">if</span> prev <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n                table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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 boolean\">None</span>\n                current <span class=\"token operator\">=</span> <span class=\"token builtin\">next</span>\n            <span class=\"token keyword\">elif</span> <span class=\"token builtin\">next</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n                table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span>\n                current <span class=\"token operator\">=</span> prev\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">next</span>\n                table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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> prev\n                current <span class=\"token operator\">=</span> <span class=\"token builtin\">next</span>\n        <span class=\"token keyword\">elif</span> c<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'Z'</span><span class=\"token punctuation\">:</span>\n            <span class=\"token punctuation\">(</span>prev<span class=\"token punctuation\">,</span> <span class=\"token builtin\">next</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> i <span class=\"token operator\">=</span> removed<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            answer<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">'O'</span>\n            <span class=\"token comment\"># 첫 행, 마지막 행 복구하는 경우 나눠서 처리</span>\n            <span class=\"token keyword\">if</span> prev <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n                table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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> i\n            <span class=\"token keyword\">elif</span> <span class=\"token builtin\">next</span> <span class=\"token operator\">==</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n                table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                table<span class=\"token punctuation\">[</span>prev<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i\n                table<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><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> i\n    <span class=\"token keyword\">return</span> <span class=\"token string\">''</span><span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span>answer<span class=\"token punctuation\">)</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>처음에는 스택을 이용해서 간단하게 구현했지만 역시나 효율성에서 통과하지 못했다.<br>\n도저히 방향을 못잡겠어서 질문하기를 참고했고, 연결리스트로 풀어야 한다는 팁을 얻고 연결리스트로 풀었다.<br>\n연결리스트로 풀어야 된다는 것을 알고 나서도 이것저것 생각보다 시간이 걸렸고, 전체적으로 시간이 오래 걸렸던 문제,,,<br>\n다양한 알고리즘 문제들을 풀어야 할 필요성을 느낌</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/81303 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 업무용 소프트웨어를 개발하는 니니즈웍스의 인턴인 앙몬드는 명령어 기반으로 표의 행을 선택, 삭제, 복구하는 프로그램을 작성하는 과제를 맡았습니다. 세부 요구 사항은 다음과 같습니다  위 그림에서 파란색으로 칠해진 칸은 현재 선택된 행을 나타냅니다. 단, 한 번에 한 행만 선택할 수 있으며, 표의 범위(0행 ~ 마지막 행)를 벗어날 수 없습니다. 이때, 다음과 같은 명령어를 이용하여 표를 편집합니다.  : 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.  : 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.  : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.  : 가장 최근에 삭제된 …","frontmatter":{"date":"May 09, 2022","title":"[Programmers] 81303번: 표 편집 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-81303/"}},"next":{"id":"ba3c338f-8e8f-58da-8028-1d002e8542ac","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/81302\">https://programmers.co.kr/learn/courses/30/lessons/81302</a></p>\n<p>개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.</p>\n<p>코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼\n아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.</p>\n<ol>\n<li>대기실은 5개이며, 각 대기실은 5x5 크기입니다.</li>\n<li>거리두기를 위하여 응시자들 끼리는 맨해튼 거리가 2 이하로 앉지 말아 주세요.</li>\n<li>단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.</li>\n</ol>\n<p>5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 <code class=\"language-text\">places</code>가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 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><code class=\"language-text\">places</code>의 행 길이(대기실 개수) = 5\n<ul>\n<li><code class=\"language-text\">places</code>의 각 행은 하나의 대기실 구조를 나타냅니다.</li>\n</ul>\n</li>\n<li><code class=\"language-text\">places</code>의 열 길이(대기실 세로 길이) = 5</li>\n<li><code class=\"language-text\">places</code>의 원소는 <code class=\"language-text\">P</code>, <code class=\"language-text\">O</code>, <code class=\"language-text\">X</code>로 이루어진 문자열입니다.\n<ul>\n<li><code class=\"language-text\">places</code> 원소의 길이(대기실 가로 길이) = 5</li>\n<li><code class=\"language-text\">P</code>는 응시자가 앉아있는 자리를 의미합니다.</li>\n<li><code class=\"language-text\">O</code>는 빈 테이블을 의미합니다.</li>\n<li><code class=\"language-text\">X</code>는 파티션을 의미합니다.</li>\n</ul>\n</li>\n<li>입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.</li>\n<li>return 값 형식\n<ul>\n<li>1차원 정수 배열에 5개의 원소를 담아서 return 합니다.</li>\n<li><code class=\"language-text\">places</code>에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.</li>\n<li>각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.</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>places</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>[[“POOOP”, “OXXOX”, “OPXPX”, “OOXOX”, “POXXP”], [“POOPX”, “OXPXP”, “PXXXO”, “OXXXO”, “OOOPP”], [“PXOPX”, “OXOXP”, “OXPOX”, “OXXOP”, “PXPOX”], [“OOOXX”, “XOOOX”, “OOOXX”, “OXOOX”, “OOOOO”], [“PXPXP”, “XPXPX”, “PXPXP”, “XPXPX”, “PXPXP”]]</td>\n<td>[1, 0, 1, 1, 1]</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</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\"># 강의실마다 확인</span>\n    <span class=\"token keyword\">for</span> place <span class=\"token keyword\">in</span> places<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 keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># 사람이 있는 경우에만 탐색하고, 반환값 체크</span>\n                <span class=\"token keyword\">if</span> place<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'P'</span> <span class=\"token keyword\">and</span> <span class=\"token keyword\">not</span> search<span class=\"token punctuation\">(</span>place<span class=\"token punctuation\">,</span> j<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                    check <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span>\n        <span class=\"token comment\"># check에 따라 값 입력</span>\n        <span class=\"token keyword\">if</span> check<span class=\"token punctuation\">:</span> answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n<ul>\n<li><strong>강의실마다 거리두기 확인</strong><br>\n사람이 있는 경우에만 <code class=\"language-text\">search()</code> 함수로 탐색하고, 반환값이 <strong>False</strong>면 <code class=\"language-text\">check</code>도 <strong>False</strong>로 저장<br>\n전부 탐색 끝난 후에 <code class=\"language-text\">check</code> 값에 따라 <code class=\"language-text\">answer</code>에 거리두기 여부 <strong>append</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\">search</span><span class=\"token punctuation\">(</span>place<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    stack <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<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 operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token boolean\">False</span> <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\">5</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><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    dx <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</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\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    dy <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</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\">1</span><span class=\"token punctuation\">]</span>\n    visited<span class=\"token punctuation\">[</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n    <span class=\"token comment\"># DFS 탐색</span>\n    <span class=\"token keyword\">while</span> stack<span class=\"token punctuation\">:</span>\n        x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> d <span class=\"token operator\">=</span> stack<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> d <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">continue</span>     <span class=\"token comment\"># 깊이 2까지만</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 number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            next_x<span class=\"token punctuation\">,</span> next_y <span class=\"token operator\">=</span> x <span class=\"token operator\">+</span> dx<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> dy<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">if</span> next_x <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> next_x <span class=\"token operator\">>=</span> <span class=\"token number\">5</span> <span class=\"token keyword\">or</span> next_y <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> next_y <span class=\"token operator\">>=</span> <span class=\"token number\">5</span> <span class=\"token keyword\">or</span> visited<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">continue</span>\n            <span class=\"token keyword\">if</span> place<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"P\"</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">False</span>\n            <span class=\"token keyword\">if</span> place<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"O\"</span><span class=\"token punctuation\">:</span> stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>next_x<span class=\"token punctuation\">,</span> next_y<span class=\"token punctuation\">,</span> d<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">True</span></code></pre></div>\n<ul>\n<li><strong>DFS 탐색 함수</strong><br>\n<strong>DFS</strong>로 탐색하면서 <code class=\"language-text\">P</code>를 만나면 <strong>False</strong> 반환 / <code class=\"language-text\">O</code>를 만나면 <code class=\"language-text\">stack</code>에 <strong>append</strong>해서 탐색 계속 <em><strong>(깊이 2까지만)</strong></em><br>\n시작 좌표 <code class=\"language-text\">x, y</code> 의 <code class=\"language-text\">visited</code> 값을 <strong>True</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\">search</span><span class=\"token punctuation\">(</span>place<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    stack <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<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 operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token boolean\">False</span> <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\">5</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><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    dx <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</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\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    dy <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</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\">1</span><span class=\"token punctuation\">]</span>\n    visited<span class=\"token punctuation\">[</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n    <span class=\"token comment\"># DFS 탐색</span>\n    <span class=\"token keyword\">while</span> stack<span class=\"token punctuation\">:</span>\n        x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> d <span class=\"token operator\">=</span> stack<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> d <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">continue</span>     <span class=\"token comment\"># 깊이 2까지만</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 number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            next_x<span class=\"token punctuation\">,</span> next_y <span class=\"token operator\">=</span> x <span class=\"token operator\">+</span> dx<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> dy<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">if</span> next_x <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> next_x <span class=\"token operator\">>=</span> <span class=\"token number\">5</span> <span class=\"token keyword\">or</span> next_y <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> next_y <span class=\"token operator\">>=</span> <span class=\"token number\">5</span> <span class=\"token keyword\">or</span> visited<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">continue</span>\n            <span class=\"token keyword\">if</span> place<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"P\"</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">False</span>\n            <span class=\"token keyword\">if</span> place<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"O\"</span><span class=\"token punctuation\">:</span> stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>next_x<span class=\"token punctuation\">,</span> next_y<span class=\"token punctuation\">,</span> d<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">True</span>\n            \n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>places<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    <span class=\"token comment\"># 강의실마다 확인</span>\n    <span class=\"token keyword\">for</span> place <span class=\"token keyword\">in</span> places<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 keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># 사람이 있는 경우에만 탐색하고, 반환값 체크</span>\n                <span class=\"token keyword\">if</span> place<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">'P'</span> <span class=\"token keyword\">and</span> <span class=\"token keyword\">not</span> search<span class=\"token punctuation\">(</span>place<span class=\"token punctuation\">,</span> j<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                    check <span class=\"token operator\">=</span> <span class=\"token boolean\">False</span>\n        <span class=\"token comment\"># check에 따라 값 입력</span>\n        <span class=\"token keyword\">if</span> check<span class=\"token punctuation\">:</span> answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token number\">0</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>DFS로 깊이 2까지만 탐색하면 되는 문제.<br>\n코드가 예쁘지는 않지만 코테 대비해서 최대한 빠르게 풀려고 했는데 걸린 시간은 만족!</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] 81302번: 거리두기 확인하기 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-81302/"}},"prev":{"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/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/pg-81303/","nextSlug":"/pg-81302/","prevSlug":"/pg-81304/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}