{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/pg-67259/",
    "result": {"data":{"cur":{"id":"7f155776-9804-542d-8706-559233061c13","html":"<h2 id=\"2020-카카오-인턴십\" style=\"position:relative;\"><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2020 카카오 인턴십 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>[2020 카카오 인턴십]</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/67259\">https://programmers.co.kr/learn/courses/30/lessons/67259</a></p>\n<p>건설회사의 설계사인 죠르디는 고객사로부터 자동차 경주로 건설에 필요한 견적을 의뢰받았습니다.<br>\n제공된 경주로 설계 도면에 따르면 경주로 부지는 <code class=\"language-text\">N x N</code> 크기의 정사각형 격자 형태이며 각 격자는 <code class=\"language-text\">1 x 1</code> 크기입니다.<br>\n설계 도면에는 각 격자의 칸은 <code class=\"language-text\">0</code> 또는 <code class=\"language-text\">1</code> 로 채워져 있으며, <code class=\"language-text\">0</code>은 칸이 비어 있음을 <code class=\"language-text\">1</code>은 해당 칸이 벽으로 채워져 있음을 나타냅니다.<br>\n경주로의 출발점은 (0, 0) 칸(좌측 상단)이며, 도착점은 (N-1, N-1) 칸(우측 하단)입니다. 죠르디는 출발점인 (0, 0) 칸에서 출발한 자동차가 도착점인 (N-1, N-1) 칸까지 무사히 도달할 수 있게 중간에 끊기지 않도록 경주로를 건설해야 합니다.<br>\n경주로는 상, 하, 좌, 우로 인접한 두 빈 칸을 연결하여 건설할 수 있으며, 벽이 있는 칸에는 경주로를 건설할 수 없습니다.<br>\n이때, 인접한 두 빈 칸을 상하 또는 좌우로 연결한 경주로를 <code class=\"language-text\">직선 도로</code> 라고 합니다.<br>\n또한 두 <code class=\"language-text\">직선 도로</code>가 서로 직각으로 만나는 지점을 <code class=\"language-text\">코너</code> 라고 부릅니다.<br>\n건설 비용을 계산해 보니 <code class=\"language-text\">직선 도로</code> 하나를 만들 때는 100원이 소요되며, <code class=\"language-text\">코너</code>를 하나 만들 때는 500원이 추가로 듭니다.<br>\n죠르디는 견적서 작성을 위해 경주로를 건설하는 데 필요한 최소 비용을 계산해야 합니다.</p>\n<p>예를 들어, 아래 그림은 <code class=\"language-text\">직선 도로</code> 6개와 <code class=\"language-text\">코너</code> 4개로 구성된 임의의 경주로 예시이며, 건설 비용은 6 x 100 + 4 x 500 = 2600원 입니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADwUlEQVQ4y42Uy28bVRTG88fAghVbWLDh72CNRKkQAVEQTR/Qxil9JpSKIiF2sCBUsGCBWgRSq5TUTWzPy5732I7tOGM7noztJmmc+aFzW5uk3bA4mjvfnPnu+b5z7p2pbXbH9XZvLE+JaiseV5vx9P0Z1jn2PsGO4hOOmXq7R22zy8bWNq3uDoZXQ3citRas2Ulwog2cqKHWkzzd9rG86jRPOIRrprbZzTa2tjO94mXFSpCt/nU3W/37Xqa51SxfNDKt4mVa+VkULTfLl8zMsIOsaDkKK5h2ZjhB1oj7mXAJodqlZNp4zR4/n3uX5QsnieKUtZJJUN8kbGwRNWPscIM1vUy11SHYaD/H6hRNh0acqCpnGnEfveKTL+hE8YB7V0/w5+Is1e4Io+JRFylb20he2Ghj2IGSLvImmMiX9ZTQdEIer2sEgzFebhZ/fpZweIhuOVNvxCepSjaf/DzBtCPYVLJuOjjpPun8WXYWzuOPxpT0ipIlEiXPq7UoWa7aQPBnWBOt7B0nlJ2kwtWwQffry3RvXeNxdZMHK49Usl72MCyH9ZLJg4d5zIqHZlQwbZ81rczjkqVsmBLKi27aOIMDhrk5hvOn8Z8cohk21WZMECdEe+D0n7AetajtQTA6JIwTfKnwqGSpruLXKEhHdzO2Pv+Q9mcfEO6BYVQUWf6H70lPnSDNzdH95iqjhTP0T71P/qcfcTd76GX3P0Lxwxdv9DLBHiRnPiY5PUu0D4ZmqWf66UnGb79O/9tFZUl6e4nxW6+RLJzFG46VumMeimQhtHpD0stfkF67iN3fpbCu4SS77OTm6N9eQjuEvB3iAP0rX5IsXsLsDtS/LzSl/7wpTbpLX6lYC5us3H/IujRKsJtXeOTVWLm/Qils0Fu8RPzdTVb9OmsF/YWmdHcwyy7BLjxZOMPgeo4A0PwaITBYusTo2kX80SGmyNuHQW6Owa3rBMMDNQHHBttwQrWLNzqkM/cRB2++SnIjR+9Gjp2rFzh44xU650+pOdVLJrWnMHzvHQbnPsERD43K8S5bbkRBmhL3WV9eJpk/Tbq4QOf2EoMbC/Tm5yjcuYPf7ikljXSfzq+/0Ln7B0E3VXP60kkpWg62X8Nvb+MOD7CTXf7x6zg7e7iDpwqX7zLIUWMLr5MqsopXpSA2HPVQqpRDL7eGXAgyBjLUYoOsVZQ9iparToVuB2iCWS6lsoflRWwcnUNZSMkvhnTuZTyh1Usx3UhdZcu//U6+ZB7v8oT0f0Wro/LlovCqTcp+FbfamN7a/wKz7X/3z7rskQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"kakao_road2.png\"\n        title=\"kakao_road2.png\"\n        src=\"/static/0ebad25632256e9025318a4b68fd4c38/37523/kakao_road2.png\"\n        srcset=\"/static/0ebad25632256e9025318a4b68fd4c38/e9ff0/kakao_road2.png 180w,\n/static/0ebad25632256e9025318a4b68fd4c38/f21e7/kakao_road2.png 360w,\n/static/0ebad25632256e9025318a4b68fd4c38/37523/kakao_road2.png 720w,\n/static/0ebad25632256e9025318a4b68fd4c38/00d43/kakao_road2.png 1000w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>또 다른 예로, 아래 그림은 직선 도로 4개와 코너 1개로 구성된 경주로이며, 건설 비용은 4 x 100 + 1 x 500 = 900원 입니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADUUlEQVQ4y6VUXW/cRBTNz+FH8D/gGR6qRLRR02ybhnwVVW1aISHxCv+gT0gICcELKYXQ7Ic9ttee9cfGH2tnvfZmPZs03WXlg+6kNgkpvPAwmpkznnPvPed6lvwkWwQn+YLmahzHo//cV9hVvOJYCk5y+EmGcDhGkguoXRuK0UOcC4kNRhPwfgjej+SasDgrwCwHhn0s14QRB3Et+UlWhsNxyUy7bLNu2dGtUmHdkmlmedRU5Ky+G4QTphm8VFSjVA1etnVeatwto/S0JC4ilFFUy4M7LODnF3DEAvxsgcMgRe98AftNCecCMCYXEnNngH2+gJcJWK6Pts4RpROZ5VI0HEOzfRz8/CN++GoTv3+7jfTrLYjNNWQbtzHduYfpzjrOdtdRbK0h37iNs70GxN59pAe/wE0nYN0eovT0kjAc5jC9CD99/x2+Wf0ILz7/GM7jzyAe3kV2fwVi6y6mNLbXUGyuIltfhniyjcWHH0Ds76I3/RNMt/4mrEpmvA8ejmAPxrCLuSzxKM7l7L4FvBlgiTmaYQoXwGS3gWJ/F1Yxg6qZ1wnJpdcdDS3Whc5daAaHwrp4+epQfkwZENbqaPj14DcoYYr8zidIHz3A4XGCZpvJDqgJacNMB06QSJBGf5DKFjqOR3VLOEEMVbPgvwVEYwVifwdczME066qGY5iOj7ZmoR8N5UUaRKSaTk1G37lBAqZzBDNg2liGeLZ3U0MZ2Y9lM1NWdFA1KrPcmoxwLzqBZvQQzolwBeL5I9k+N0yhkonQ8kJ5yQ1PYPsxWsyUMrhhAi8awnIDtBQdznSO4t4tTJ7uQM/Ppd7/MOUUrzs6mqwLzXKlnhTg4LApdaTSKVsK8PLVH1CSHPnqp0i/2PgXU7ICGvekbnRA0ahUnXt1uYSTJLppI1oAZ41lTJ/twX1Tyg6oM6QFkTXVriyreize73ICVbfgXwDi4R0UXz4GF7PrGlIGRq+PlmbKy+EVU7QbpgwlNsgFIqePuB/Ci0dSoht/SkfnsLxAXro0ZSCzpt6rTDHdQGKUvR2lkky2nMxwcv1PochESu8cmUDlHikGVPOdKaaDjtGTGBlE54QRGWl9rQ9pQQBFuZxPayOu7t+PTWqy6oGtjfg/o+L4C5zHjdCQnI8jAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"kakao_road3.png\"\n        title=\"kakao_road3.png\"\n        src=\"/static/1660f205f0e3e9311894309ae0105dda/37523/kakao_road3.png\"\n        srcset=\"/static/1660f205f0e3e9311894309ae0105dda/e9ff0/kakao_road3.png 180w,\n/static/1660f205f0e3e9311894309ae0105dda/f21e7/kakao_road3.png 360w,\n/static/1660f205f0e3e9311894309ae0105dda/37523/kakao_road3.png 720w,\n/static/1660f205f0e3e9311894309ae0105dda/00d43/kakao_road3.png 1000w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>도면의 상태(0은 비어 있음, 1은 벽)을 나타내는 2차원 배열 board가 매개변수로 주어질 때, 경주로를 건설하는데 필요한 최소 비용을 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>board는 2차원 정사각 배열로 배열의 크기는 3 이상 25 이하입니다.</li>\n<li>board 배열의 각 원소의 값은 0 또는 1 입니다.\n<ul>\n<li>도면의 가장 왼쪽 상단 좌표는 (0, 0)이며, 가장 우측 하단 좌표는 (N-1, N-1) 입니다.</li>\n<li>원소의 값 0은 칸이 비어 있어 도로 연결이 가능함을 1은 칸이 벽으로 채워져 있어 도로 연결이 불가능함을 나타냅니다.</li>\n</ul>\n</li>\n<li>board는 항상 출발점에서 도착점까지 경주로를 건설할 수 있는 형태로 주어집니다.</li>\n<li>출발점과 도착점 칸의 원소의 값은 항상 0으로 주어집니다.</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>board</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>[[0,0,0],[0,0,0],[0,0,0]]</td>\n<td>900</td>\n</tr>\n<tr>\n<td>[[0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,0],[0,0,0,1,0,0,0,1],[0,0,1,0,0,0,1,0],[0,1,0,0,0,1,0,0],[1,0,0,0,0,0,0,0]]</td>\n<td>3800</td>\n</tr>\n<tr>\n<td>[[0,0,1,0],[0,0,0,0],[0,1,0,1],[1,0,0,0]]</td>\n<td>2100</td>\n</tr>\n<tr>\n<td>[[0,0,0,0,0,0],[0,1,1,1,1,0],[0,0,1,0,0,0],[1,0,0,1,0,1],[0,1,0,0,0,1],[0,0,0,0,0,0]]</td>\n<td>3200</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>BFS, DP</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># BFS 탐색</span>\n    q <span class=\"token operator\">=</span> deque<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">,</span> cost<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">while</span> q<span class=\"token punctuation\">:</span>\n        x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">,</span> cost <span class=\"token operator\">=</span> q<span class=\"token punctuation\">.</span>popleft<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</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 comment\"># boundary 안이고 벽이 아닌 경우</span>\n            <span class=\"token keyword\">if</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_x <span class=\"token operator\">&lt;</span> N <span class=\"token keyword\">and</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_y <span class=\"token operator\">&lt;</span> N <span class=\"token keyword\">and</span> board<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 number\">0</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># 직선 도로 비용 추가</span>\n                next_cost <span class=\"token operator\">=</span> cost <span class=\"token operator\">+</span> <span class=\"token number\">100</span>\n                <span class=\"token comment\"># 방향이 달라지면 코너 비용 추가</span>\n                <span class=\"token keyword\">if</span> d <span class=\"token operator\">!=</span> i <span class=\"token keyword\">and</span> d <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                    next_cost <span class=\"token operator\">+=</span> <span class=\"token number\">500</span>\n                <span class=\"token comment\"># 해당 cost_list 값보다 작으면 업데이트하고 append</span>\n                <span class=\"token keyword\">if</span> next_cost <span class=\"token operator\">&lt;</span> cost_list<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>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                    cost_list<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>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_cost\n                    q<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> i<span class=\"token punctuation\">,</span> next_cost<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>cost_list<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<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ul>\n<li><strong>cost_list에 누적 최소 비용을 저장하면서 BFS 탐색</strong><br>\nboundary 안이고 벽이 아닌 경우에는 직선 도로 비용을 더해서 <code class=\"language-text\">next_cost</code>에 저장하고,<br>\n만약 방향이 달라진 경우에는 코너 비용도 추가해서 저장해준다.<br>\n해당 <code class=\"language-text\">cost_list[next_y][next_x][i]</code> 값보다 <code class=\"language-text\">next_cost</code> 값이 작으면 <code class=\"language-text\">cost_list</code> 값을 업데이트하고 <strong>deque</strong>에 <strong>append</strong>해준다.<br>\n마지막 위치에 해당하는 <code class=\"language-text\">cost_list</code> 값들 중 최솟값이 정답</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> deque\n<span class=\"token keyword\">import</span> sys\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>board<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer<span class=\"token punctuation\">,</span> N <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>board<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    cost_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>sys<span class=\"token punctuation\">.</span>maxsize <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\">4</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 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 punctuation\">)</span><span class=\"token punctuation\">]</span>   <span class=\"token comment\"># y좌표, x좌표, 방향에 해당하는 누적 최소 비용 저장</span>\n    x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">,</span> cost <span class=\"token operator\">=</span> <span class=\"token number\">0</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>\n    <span class=\"token comment\"># BFS 탐색</span>\n    q <span class=\"token operator\">=</span> deque<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">,</span> cost<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">while</span> q<span class=\"token punctuation\">:</span>\n        x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> d<span class=\"token punctuation\">,</span> cost <span class=\"token operator\">=</span> q<span class=\"token punctuation\">.</span>popleft<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</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 comment\"># boundary 안이고 벽이 아닌 경우</span>\n            <span class=\"token keyword\">if</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_x <span class=\"token operator\">&lt;</span> N <span class=\"token keyword\">and</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_y <span class=\"token operator\">&lt;</span> N <span class=\"token keyword\">and</span> board<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 number\">0</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># 직선 도로 비용 추가</span>\n                next_cost <span class=\"token operator\">=</span> cost <span class=\"token operator\">+</span> <span class=\"token number\">100</span>\n                <span class=\"token comment\"># 방향이 달라지면 코너 비용 추가</span>\n                <span class=\"token keyword\">if</span> d <span class=\"token operator\">!=</span> i <span class=\"token keyword\">and</span> d <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                    next_cost <span class=\"token operator\">+=</span> <span class=\"token number\">500</span>\n                <span class=\"token comment\"># 해당 cost_list 값보다 작으면 업데이트 하고 append</span>\n                <span class=\"token keyword\">if</span> next_cost <span class=\"token operator\">&lt;</span> cost_list<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>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                    cost_list<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>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> next_cost\n                    q<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> i<span class=\"token punctuation\">,</span> next_cost<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>cost_list<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<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> answer</code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p><strong>BFS</strong>를 사용해야겠다는 생각은 처음부터 하고 구현을 했고, 하다가 해당 경로의 최소 누적 비용을 저장할 필요성을 느껴서 <strong>DP</strong>도 섞어서 구현을 했다.<br>\n시간은 조금 걸렸지만 구현을 다 하고 확인을 하니 계속 마지막 테스트 케이스만 틀려서 다른 사람들의 힌트를 확인했다..<br>\n해당 좌표에 대해서만 최소 누적 비용을 저장하고 비교하는 것이 아니라 <code class=\"language-text\">방향</code>에 따라 다르게 저장을 할 필요가 있다고 해서 <code class=\"language-text\">cost_list</code> 리스트를 <strong>3차원</strong>으로 변경하니까 통과,,<br>\n카카오 4번 문제부터는 확실히 난이도가 올라가는 것 같다,,</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2020 카카오 인턴십]</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":"[2020 카카오 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/67259 건설회사의 설계사인 죠르디는 고객사로부터 자동차 경주로 건설에 필요한 견적을 의뢰받았습니다. 제공된 경주로 설계 도면에 따르면 경주로 부지는  크기의 정사각형 격자 형태이며 각 격자는  크기입니다. 설계 도면에는 각 격자의 칸은  또는  로 채워져 있으며, 은 칸이 비어 있음을 은 해당 칸이 벽으로 채워져 있음을 나타냅니다. 경주로의 출발점은 (0, 0) 칸(좌측 상단)이며, 도착점은 (N-1, N-1) 칸(우측 하단)입니다. 죠르디는 출발점인 (0, 0) 칸에서 출발한 자동차가 도착점인 (N-1, N-1) 칸까지 무사히 도달할 수 있게 중간에 끊기지 않도록 경주로를 건설해야 합니다. 경주로는 상, 하, 좌, 우로 인접한 두 빈 칸을 연결하여 건설할 수 있으며, 벽이 있는 칸에는 경주로를 건설할 수 없습니다. 이때, 인접한 두 빈 칸을 상하 또는 좌…","frontmatter":{"date":"May 02, 2022","title":"[Programmers] 67259번: 경주로 건설 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-67259/"}},"next":{"id":"ac590477-c190-5bff-a8e1-2a4726375ba3","html":"<h2 id=\"2020-카카오-인턴십\" style=\"position:relative;\"><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2020 카카오 인턴십 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>[2020 카카오 인턴십]</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/67258\">https://programmers.co.kr/learn/courses/30/lessons/67258</a></p>\n<p>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</p>\n<p>개발자 출신으로 세계 최고의 갑부가 된 어피치는 스트레스를 받을 때면 이를 풀기 위해 오프라인 매장에 쇼핑을 하러 가곤 합니다.<br>\n어피치는 쇼핑을 할 때면 매장 진열대의 특정 범위의 물건들을 모두 싹쓸이 구매하는 습관이 있습니다.<br>\n어느 날 스트레스를 풀기 위해 보석 매장에 쇼핑을 하러 간 어피치는 이전처럼 진열대의 특정 범위의 보석을 모두 구매하되 특별히 아래 목적을 달성하고 싶었습니다.<br>\n<code class=\"language-text\">진열된 모든 종류의 보석을 적어도 1개 이상 포함하는 가장 짧은 구간을 찾아서 구매</code></p>\n<p>예를 들어 아래 진열대는 4종류의 보석(RUBY, DIA, EMERALD, SAPPHIRE) 8개가 진열된 예시입니다.</p>\n<table>\n<thead>\n<tr>\n<th>진열대 번호</th>\n<th>1</th>\n<th>2</th>\n<th>3</th>\n<th>4</th>\n<th>5</th>\n<th>6</th>\n<th>7</th>\n<th>8</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>보석 이름</td>\n<td>DIA</td>\n<td>RUBY</td>\n<td>RUBY</td>\n<td>DIA</td>\n<td>DIA</td>\n<td>EMERALD</td>\n<td>SAPPHIRE</td>\n<td>DIA</td>\n</tr>\n</tbody>\n</table>\n<p>진열대의 3번부터 7번까지 5개의 보석을 구매하면 모든 종류의 보석을 적어도 하나 이상씩 포함하게 됩니다.</p>\n<p>진열대의 3, 4, 6, 7번의 보석만 구매하는 것은 중간에 특정 구간(5번)이 빠지게 되므로 어피치의 쇼핑 습관에 맞지 않습니다.</p>\n<p>진열대 번호 순서대로 보석들의 이름이 저장된 배열 gems가 매개변수로 주어집니다. 이때 모든 보석을 하나 이상 포함하는 가장 짧은 구간을 찾아서 return 하도록 solution 함수를 완성해주세요.<br>\n가장 짧은 구간의 <code class=\"language-text\">시작 진열대 번호</code>와 <code class=\"language-text\">끝 진열대 번호</code>를 차례대로 배열에 담아서 return 하도록 하며, 만약 가장 짧은 구간이 여러 개라면 <code class=\"language-text\">시작 진열대 번호</code>가 가장 작은 구간을 return 합니다.</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>gems 배열의 크기는 1 이상 100,000 이하입니다.\n<ul>\n<li>gems 배열의 각 원소는 진열대에 나열된 보석을 나타냅니다.</li>\n<li>gems 배열에는 1번 진열대부터 진열대 번호 순서대로 보석이름이 차례대로 저장되어 있습니다.</li>\n<li>gems 배열의 각 원소는 길이가 1 이상 10 이하인 알파벳 대문자로만 구성된 문자열입니다.</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>gems</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>[“DIA”, “RUBY”, “RUBY”, “DIA”, “DIA”, “EMERALD”, “SAPPHIRE”, “DIA”]</td>\n<td>[3, 7]</td>\n</tr>\n<tr>\n<td>[“AA”, “AB”, “AC”, “AA”, “AC”]</td>\n<td>[1, 3]</td>\n</tr>\n<tr>\n<td>[“XYZ”, “XYZ”, “XYZ”]</td>\n<td>[1, 1]</td>\n</tr>\n<tr>\n<td>[“ZZZ”, “YYY”, “NNNN”, “YYY”, “BBB”]</td>\n<td>[1, 5]</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>Two Pointers</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\">start <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\ncurrent <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 기본값 0인 dictionary 생성</span>\ncount <span class=\"token operator\">=</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># set을 이용해서 중복 제거하고 전체 보석 수 저장</span>\nanswer <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">defaultdict</code>에 <strong>int</strong>를 인자로 주고 생성하여 기본값이 <strong>0</strong>인 <strong>dictionary</strong>를 생성</li>\n<li><code class=\"language-text\">set</code>을 이용해서 중복 제거하고 전체 보석 수 저장</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># start, end 투 포인터를 이용해서 가장 짧은 구간 찾기</span>\n    <span class=\"token keyword\">for</span> end <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>end<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token comment\"># 모든 보석을 하나 이상 포함하는 경우</span>\n        <span class=\"token keyword\">while</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>current<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> count<span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 해당 구간의 길이가 answer 구간 길이보다 작으면 업데이트</span>\n            <span class=\"token keyword\">if</span> end <span class=\"token operator\">-</span> start <span class=\"token operator\">&lt;</span> answer<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> answer<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                answer<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> answer<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> start<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> end<span class=\"token operator\">+</span><span class=\"token number\">1</span>\n            current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-=</span> <span class=\"token number\">1</span>\n            <span class=\"token comment\"># 해당 키 값이 0이 되면 dictionary에서 삭제</span>\n            <span class=\"token keyword\">if</span> current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">del</span> current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n            start <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n<ul>\n<li><strong>start, end 투 포인터를 이용해서 가장 짧은 구간 찾기</strong><br>\n<code class=\"language-text\">end</code>가 전체 보석 리스트의 처음부터 끝까지 이동하면서 해당 보석의 <strong>dictionary</strong> 키 값을 <strong>+1</strong><br>\n모든 보석을 하나 이상 포함하는 경우에는,<br>\n해당 구간의 길이가 <code class=\"language-text\">answer</code> 구간 길이보다 작은지 확인하고 작으면 <code class=\"language-text\">answer</code> 값 업데이트하고<br>\n해당 키 값을 <strong>-1</strong> 하고(이 때, 해당 키 값이 <strong>0</strong>이 되면 <strong>dictionary</strong>에서 삭제), <code class=\"language-text\">start</code>를 다음 위치로 옮기고 반복한다.</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> defaultdict\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    start <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n    current <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 기본값 0인 dictionary 생성</span>\n    count <span class=\"token operator\">=</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># set을 이용해서 중복 제거하고 전체 보석 수 저장</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    <span class=\"token comment\"># start, end 투 포인터를 이용해서 가장 짧은 구간 찾기</span>\n    <span class=\"token keyword\">for</span> end <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>end<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token comment\"># 모든 보석을 하나 이상 포함하는 경우</span>\n        <span class=\"token keyword\">while</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>current<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> count<span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 해당 구간의 길이가 answer 구간 길이보다 작으면 업데이트</span>\n            <span class=\"token keyword\">if</span> end <span class=\"token operator\">-</span> start <span class=\"token operator\">&lt;</span> answer<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> answer<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                answer<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> answer<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> start<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> end<span class=\"token operator\">+</span><span class=\"token number\">1</span>\n            current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-=</span> <span class=\"token number\">1</span>\n            <span class=\"token comment\"># 해당 키 값이 0이 되면 dictionary에서 삭제</span>\n            <span class=\"token keyword\">if</span> current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">del</span> current<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n            start <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p>처음에는 규칙이 있을 거라고 생각하고 규칙을 찾아서 해봤지만, 예외 케이스도 많이 나오고 효율성도 통과하지 못해서 아예 다른 방식을 생각해보았다.<br>\n그러다가 예전에 배웠었던 <code class=\"language-text\">슬라이딩 윈도우</code>를 생각해냈는데 <code class=\"language-text\">슬라이딩 윈도우</code>는 고정 길이고, 여기서는 길이가 변해야 하기 때문에 <code class=\"language-text\">투 포인터</code> 알고리즘이라고 얘기하는게 맞는 것 같다.<br>\n<strong>dictionary</strong>와 <strong>투 포인터</strong>를 이용해서 구현했는데 모든 보석을 하나 이상 포함하고 있는지 처리하는 과정이 효율적이지 않아서 이 부분은 검색을 통해 <code class=\"language-text\">defaultdict</code> 라는 것이 있다는 것을 알게 되었고, <code class=\"language-text\">defaultdict</code>를 이용해서 간단하게 구현할 수 있었다.</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2020 카카오 인턴십]</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 01, 2022","title":"[Programmers] 67258번: 보석 쇼핑 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-67258/"}},"prev":{"id":"4f472c1c-d4dc-5677-afd1-ad7d6aecfdc3","html":"<h2 id=\"2020-카카오-인턴십\" style=\"position:relative;\"><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2020 카카오 인턴십 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>[2020 카카오 인턴십]</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/67260\">https://programmers.co.kr/learn/courses/30/lessons/67260</a></p>\n<p>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</p>\n<p>오지 탐험가인 프로도는 탐험 도중 n개의 방으로 이루어진 지하 동굴을 탐험하게 되었습니다. 모든 방에는 0부터 n - 1 까지 번호가 붙어있고, 이 동굴에 들어갈 수 있는 유일한 입구는 0번 방과 연결되어 있습니다. 각 방들은 양방향으로 통행이 가능한 통로로 서로 연결되어 있는데, 서로 다른 두 방을 직접 연결하는 통로는 오직 하나입니다. 임의의 서로 다른 두 방 사이의 최단경로는 딱 한 가지만 있으며, 또한 임의의 두 방 사이에 이동이 불가능한 경우는 없습니다.</p>\n<p>탐험에 앞서 이 지하 동굴의 지도를 손에 넣은 프로도는 다음과 같이 탐험 계획을 세웠습니다.</p>\n<ol>\n<li>모든 방을 적어도 한 번은 방문해야 합니다.</li>\n<li>특정 방은 방문하기 전에 반드시 먼저 방문할 방이 정해져 있습니다.<br>\n2-1. 이는 A번 방은 방문하기 전에 반드시 B번 방을 먼저 방문해야 한다는 의미입니다.<br>\n2-2. 어떤 방을 방문하기 위해 반드시 먼저 방문해야 하는 방은 없거나 또는 1개 입니다.<br>\n2-3. 서로 다른 두 개 이상의 방에 대해 먼저 방문해야 하는 방이 같은 경우는 없습니다.<br>\n2-4. 어떤 방이 먼저 방문해야 하는 방이면서 동시에 나중에 방문해야 되는 방인 경우는 없습니다.</li>\n</ol>\n<p>위 계획 중 2-2, 2-3, 2-4는 순서를 지켜 방문해야 하는 두 방의 쌍이 <code class=\"language-text\">A → B</code>(A를 먼저 방문하고 B를 방문함) 형태로 유일함을 의미합니다. 즉, 프로도는 아래와 같은 형태로 방문순서가 잡히지 않도록 방문 계획을 세웠습니다.</p>\n<ul>\n<li><code class=\"language-text\">A → B, A → C</code> (방문순서 배열 order = […,[A,B],…,[A,C],…]) 형태로 A를 방문 후에 방문해야 할 방이 B와 C로 두 개 또는 그 이상인 경우</li>\n<li><code class=\"language-text\">X → A, Z → A</code> (방문순서 배열 order = […,[X,A],…,[Z,A],…]) 형태로 A를 방문하기 전에 방문해야 할 방이 X와 Z로 두 개 또는 그 이상인 경우</li>\n<li><code class=\"language-text\">A → B → C</code> (방문순서 배열 order = […,[A,B],…,[B,C],…) 형태로 B처럼 A 방문 후이면서 동시에 C 방문 전인 경우</li>\n</ul>\n<p>그리고 먼저 방문해야 할 방과 나중에 방문할 방을 반드시 연속해서 방문해야 할 필요는 없어 A방을 방문한 후 다른 방을 방문한 후 B방을 방문해도 좋습니다.</p>\n<p>방 개수 n, 동굴의 각 통로들이 연결하는 두 방의 번호가 담긴 2차원 배열 path, 프로도가 정한 방문 순서가 담긴 2차원 배열 order가 매개변수로 주어질 때, 프로도가 규칙에 맞게 모든 방을 탐험할 수 있을 지 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>n은 2 이상 200,000 이하입니다.</li>\n<li>path 배열의 세로(행) 길이는 n - 1 입니다.\n<ul>\n<li>path 배열의 원소는 [방 번호 A, 방 번호 B] 형태입니다.</li>\n<li>두 방 A, B사이를 연결하는 통로를 나타냅니다.</li>\n<li>통로가 연결하는 두 방 번호가 순서없이 들어있음에 주의하세요.</li>\n</ul>\n</li>\n<li>order 배열의 세로(행) 길이는 1 이상 (n / 2) 이하입니다.\n<ul>\n<li>order 배열의 원소는 [방 번호 A, 방 번호 B] 형태입니다.</li>\n<li>A번 방을 먼저 방문한 후 B번 방을 방문해야 함을 나타냅니다.</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>n</th>\n<th>path</th>\n<th>order</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>9</td>\n<td>[[0,1],[0,3],[0,7],[8,1],[3,6],[1,2],[4,7],[7,5]]</td>\n<td>[[8,5],[6,7],[4,1]]</td>\n<td>true</td>\n</tr>\n<tr>\n<td>9</td>\n<td>[[8,1],[0,1],[1,2],[0,7],[4,7],[0,3],[7,5],[3,6]]</td>\n<td>[[4,1],[5,2]]</td>\n<td>true</td>\n</tr>\n<tr>\n<td>9</td>\n<td>[[0,1],[0,3],[0,7],[8,1],[3,6],[1,2],[4,7],[7,5]]</td>\n<td>[[4,1],[8,7],[6,5]]</td>\n<td>false</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\"># tree 정보 입력</span>\n    <span class=\"token keyword\">for</span> a<span class=\"token punctuation\">,</span> b <span class=\"token keyword\">in</span> path<span class=\"token punctuation\">:</span>\n        tree<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">)</span>\n        tree<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># 방문 순서 정보 입력</span>\n    <span class=\"token keyword\">for</span> a<span class=\"token punctuation\">,</span> b <span class=\"token keyword\">in</span> order<span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># 0을 나중에 방문해야 하는 경우는 존재 X</span>\n        <span class=\"token keyword\">if</span> b <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">False</span>\n        orders<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a</code></pre></div>\n<ul>\n<li><code class=\"language-text\">defaultdict</code>를 이용해 기본값이 <strong>list</strong>인 <strong>dictionary</strong> 생성하고 <code class=\"language-text\">path</code> 정보 저장</li>\n<li><strong>방문 순서 정보 입력</strong><br>\n방문 순서 정보를 <code class=\"language-text\">orders</code> 리스트에 입력<br>\n이 때, <strong>0</strong>을 나중에 방문해야 하는 경우는 존재할 수 없기 때문에 <code class=\"language-text\">b</code>가 <strong>0</strong>이면 <strong>False</strong> 반환하고 종료</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># DFS 탐색</span>\n    stack<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span>tree<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">while</span> stack<span class=\"token punctuation\">:</span>\n        num <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> visited<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">continue</span>\n        <span class=\"token comment\"># 먼저 방문해야 할 방이 있지만, 방문하지 않은 경우</span>\n        <span class=\"token keyword\">if</span> orders<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> <span class=\"token keyword\">not</span> visited<span class=\"token punctuation\">[</span>orders<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            after<span class=\"token punctuation\">[</span>orders<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> num\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token comment\"># 방문하지 않은 경우</span>\n        visited<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n        stack<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span>tree<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> after<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n            stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>    <span class=\"token comment\"># after 값이 있으면 append</span>\n<span class=\"token comment\"># 하나라도 방문하지 않았으면 False</span>\n    <span class=\"token keyword\">if</span> <span class=\"token boolean\">False</span> <span class=\"token keyword\">in</span> visited<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token boolean\">False</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>stack</strong>을 이용해서 방문하지 않은 경우에 <strong>stack</strong>에 연결된 노드 값을 넣는 방식으로 <strong>DFS</strong> 탐색<br>\n먼저 방문해야 할 방이 있지만 방문하지 않은 경우에는 다음에 바로 방문해서 처리해주기 위해 먼저 방문해야 할 해당 <code class=\"language-text\">after</code> 값에 현재 값 저장<br>\n일반적인 경우에는 <code class=\"language-text\">visited</code> 업데이트 해주고, <strong>stack</strong>에 연결된 노드 값 <strong>extend</strong>하고, 해당 <code class=\"language-text\">after</code> 값이 있으면 그 값도 <strong>append</strong><br>\n탐색 끝난 후에, 하나라도 방문하지 않은 곳이 있으면 <strong>False</strong> 반환</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> defaultdict\n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">,</span> path<span class=\"token punctuation\">,</span> order<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>\n    tree <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">)</span>\n    orders <span class=\"token operator\">=</span> defaultdict<span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span>\n    visited <span class=\"token operator\">=</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>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    after <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">1</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    <span class=\"token comment\"># tree 정보 입력</span>\n    <span class=\"token keyword\">for</span> a<span class=\"token punctuation\">,</span> b <span class=\"token keyword\">in</span> path<span class=\"token punctuation\">:</span>\n        tree<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>b<span class=\"token punctuation\">)</span>\n        tree<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># 방문 순서 정보 입력</span>\n    <span class=\"token keyword\">for</span> a<span class=\"token punctuation\">,</span> b <span class=\"token keyword\">in</span> order<span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># 0을 나중에 방문해야 하는 경우는 존재 X</span>\n        <span class=\"token keyword\">if</span> b <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">False</span>\n        orders<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a\n    <span class=\"token comment\"># DFS 탐색</span>\n    stack<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span>tree<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">while</span> stack<span class=\"token punctuation\">:</span>\n        num <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> visited<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">continue</span>\n        <span class=\"token comment\"># 먼저 방문해야 할 방이 있지만, 방문하지 않은 경우</span>\n        <span class=\"token keyword\">if</span> orders<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> <span class=\"token keyword\">not</span> visited<span class=\"token punctuation\">[</span>orders<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            after<span class=\"token punctuation\">[</span>orders<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> num\n            <span class=\"token keyword\">continue</span>\n        <span class=\"token comment\"># 방문하지 않은 경우</span>\n        visited<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n        stack<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span>tree<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> after<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n            stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>after<span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>    <span class=\"token comment\"># after 값이 있으면 append</span>\n    <span class=\"token comment\"># 하나라도 방문하지 않았으면 False</span>\n    <span class=\"token keyword\">if</span> <span class=\"token boolean\">False</span> <span class=\"token keyword\">in</span> visited<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token boolean\">False</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">True</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>문제를 이해하고 아이디어를 내기까지 시간이 오래걸렸다. DFS를 사용해야 한다는 것은 쉽게 알 수 있었지만, after 리스트를 만들어서 방문 우선순위를 처리하는 방법을 생각해내지 못해서 다른 사람들의 힌트를 보고 구현했다.. 그리고 30번 테스트 케이스도 계속 틀려서 이유를 몰랐는데 0을 나중에 방문해야 하는 경우는 존재할 수 없다는 것을 생각 못해서 나중에 이 부분을 처리하고 통과했다.<br>\n카카오 인턴 코테 마지막 문제답게 쉽지 않다,,</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2020 카카오 인턴십]</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 02, 2022","title":"[Programmers] 67260번: 동굴 탐험 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-67260/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/pg-67259/","nextSlug":"/pg-67258/","prevSlug":"/pg-67260/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}