{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/pg-67257/",
    "result": {"data":{"cur":{"id":"83e96ae5-b1e9-5e50-a2dd-cbe0ae841b99","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/67257\">https://programmers.co.kr/learn/courses/30/lessons/67257</a></p>\n<p>IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다.<br>\n이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다.<br>\n해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자(<code class=\"language-text\">+, -, *</code>) 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다.<br>\n단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉, <code class=\"language-text\">+</code> > <code class=\"language-text\">-</code> > <code class=\"language-text\">*</code> 또는 <code class=\"language-text\">-</code> > <code class=\"language-text\">*</code> > <code class=\"language-text\">+</code> 등과 같이 연산자 우선순위를 정의할 수 있으나 <code class=\"language-text\">+,*</code> > <code class=\"language-text\">-</code> 또는 <code class=\"language-text\">*</code> > <code class=\"language-text\">+,-</code> 처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의할 수는 없습니다. 수식에 포함된 연산자가 2개라면 정의할 수 있는 연산자 우선순위 조합은 2! = 2가지이며, 연산자가 3개라면 3! = 6가지 조합이 가능합니다.<br>\n만약 계산된 결과가 음수라면 해당 숫자의 절댓값으로 변환하여 제출하며 제출한 숫자가 가장 큰 참가자를 우승자로 선정하며, 우승자가 제출한 숫자를 우승상금으로 지급하게 됩니다.</p>\n<p>예를 들어, 참가자 중 네오가 아래와 같은 수식을 전달받았다고 가정합니다.</p>\n<p><code class=\"language-text\">\"100-200*300-500+20\"</code></p>\n<p>일반적으로 수학 및 전산학에서 약속된 연산자 우선순위에 따르면 더하기와 빼기는 서로 동등하며 곱하기는 더하기, 빼기에 비해 우선순위가 높아 <code class=\"language-text\">*</code> > <code class=\"language-text\">+,-</code> 로 우선순위가 정의되어 있습니다.<br>\n대회 규칙에 따라 <code class=\"language-text\">+</code> > <code class=\"language-text\">-</code> > <code class=\"language-text\">*</code> 또는 <code class=\"language-text\">-</code> > <code class=\"language-text\">*</code> > <code class=\"language-text\">+</code> 등과 같이 연산자 우선순위를 정의할 수 있으나 <code class=\"language-text\">+,*</code> > <code class=\"language-text\">-</code> 또는 <code class=\"language-text\">*</code> > <code class=\"language-text\">+,-</code> 처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의할 수는 없습니다.<br>\n수식에 연산자가 3개 주어졌으므로 가능한 연산자 우선순위 조합은 3! = 6가지이며, 그 중 <code class=\"language-text\">+</code> > <code class=\"language-text\">-</code> > <code class=\"language-text\">*</code> 로 연산자 우선순위를 정한다면 결괏값은 22,000원이 됩니다.<br>\n반면에 <code class=\"language-text\">*</code> > <code class=\"language-text\">+</code> > <code class=\"language-text\">-</code> 로 연산자 우선순위를 정한다면 수식의 결괏값은 -60,420 이지만, 규칙에 따라 우승 시 상금은 절댓값인 60,420원이 됩니다.</p>\n<p>참가자에게 주어진 연산 수식이 담긴 문자열 expression이 매개변수로 주어질 때, 우승 시 받을 수 있는 가장 큰 상금 금액을 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>expression은 길이가 3 이상 100 이하인 문자열입니다.</li>\n<li>expression은 공백문자, 괄호문자 없이 오로지 숫자와 3가지의 연산자(<code class=\"language-text\">+, -, *</code>) 만으로 이루어진 올바른 중위표기법(연산의 두 대상 사이에 연산기호를 사용하는 방식)으로 표현된 연산식입니다. 잘못된 연산식은 입력으로 주어지지 않습니다.\n<ul>\n<li>즉, <code class=\"language-text\">\"402+-561*\"</code>처럼 잘못된 수식은 올바른 중위표기법이 아니므로 주어지지 않습니다.</li>\n</ul>\n</li>\n<li>expression의 피연산자(operand)는 0 이상 999 이하의 숫자입니다.\n<ul>\n<li>즉, <code class=\"language-text\">\"100-2145*458+12\"</code>처럼 999를 초과하는 피연산자가 포함된 수식은 입력으로 주어지지 않습니다.</li>\n<li><code class=\"language-text\">\"-56+100\"</code>처럼 피연산자가 음수인 수식도 입력으로 주어지지 않습니다.</li>\n</ul>\n</li>\n<li>expression은 적어도 1개 이상의 연산자를 포함하고 있습니다.</li>\n<li>연산자 우선순위를 어떻게 적용하더라도, expression의 중간 계산값과 최종 결괏값은 절댓값이 263 - 1 이하가 되도록 입력이 주어집니다.</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>expression</th>\n<th>result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>“100-200*300-500+20”</td>\n<td>60420</td>\n</tr>\n<tr>\n<td>“50<em>6-3</em>2”</td>\n<td>300</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>Permutation, Stack</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> e <span class=\"token keyword\">in</span> expression<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> e <span class=\"token operator\">==</span> <span class=\"token string\">'*'</span> <span class=\"token keyword\">or</span> e <span class=\"token operator\">==</span> <span class=\"token string\">'+'</span> <span class=\"token keyword\">or</span> e <span class=\"token operator\">==</span> <span class=\"token string\">'-'</span><span class=\"token punctuation\">:</span>\n        op<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n        num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp<span class=\"token punctuation\">)</span>\n        temp <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        temp <span class=\"token operator\">=</span> <span class=\"token number\">10</span> <span class=\"token operator\">*</span> temp\n        temp <span class=\"token operator\">+=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\nnum<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp<span class=\"token punctuation\">)</span></code></pre></div>\n<ul>\n<li><strong>숫자, 연산자 분리</strong><br>\n연산자를 만나기 전까지의 값들은 숫자 형태로 <code class=\"language-text\">temp</code>에 계산해서 저장해두고<br>\n연산자를 만나면 연산자를 <code class=\"language-text\">op</code>에 저장된 숫자 <code class=\"language-text\">temp</code>를 <code class=\"language-text\">num</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 comment\"># 순열 생성</span>\norder_list <span class=\"token operator\">=</span> permutations<span class=\"token punctuation\">(</span><span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># op 중복 제거하고 순열 생성</span>\n<span class=\"token keyword\">for</span> order <span class=\"token keyword\">in</span> order_list<span class=\"token punctuation\">:</span>\n    result <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>calculate<span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 계산 결과 절댓값으로 저장</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token builtin\">max</span><span class=\"token punctuation\">(</span>answer<span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span>    <span class=\"token comment\"># 순열 반복하면서 최댓값 저장</span></code></pre></div>\n<ul>\n<li><strong>순열 생성</strong><br>\n연산자 우선순위를 정하기 위해 <strong>permutations</strong>를 이용해서 순열 생성<br>\n이 때, <code class=\"language-text\">op</code>에 중복을 제거하기 위해 <strong>set</strong> 사용<br>\n순열을 반복문 돌면서 우선순위에 맞게 <code class=\"language-text\">calculate</code> 함수 호출해서 계산하고 결과값을 절댓값으로 <code class=\"language-text\">result</code>에 저장<br>\n각 우선순위마다 나오는 결과값들 중 최댓값을 <code class=\"language-text\">answer</code>에 저장</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\">calculate</span><span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> o <span class=\"token keyword\">in</span> order<span class=\"token punctuation\">:</span>\n        temp_num <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n        temp_op <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> v <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 연산자가 우선순위 아닌 경우</span>\n            <span class=\"token keyword\">if</span> v <span class=\"token operator\">!=</span> o<span class=\"token punctuation\">:</span> \n                temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>num<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 punctuation\">)</span>\n                temp_op<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">continue</span>\n            <span class=\"token comment\"># 연산자가 우선순위인 경우, 연산자에 따라 계산</span>\n            <span class=\"token keyword\">if</span> v <span class=\"token operator\">==</span> <span class=\"token string\">'+'</span><span class=\"token punctuation\">:</span> temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp_num<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> num<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 punctuation\">)</span>\n            <span class=\"token keyword\">elif</span> v <span class=\"token operator\">==</span> <span class=\"token string\">'-'</span><span class=\"token punctuation\">:</span> temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp_num<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> num<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 punctuation\">)</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp_num<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> num<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 punctuation\">)</span>\n        num <span class=\"token operator\">=</span> temp_num\n        op <span class=\"token operator\">=</span> temp_op\n    <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span></code></pre></div>\n<ul>\n<li><strong>정해진 우선순위 <code class=\"language-text\">order</code>에 맞게 계산하는 함수</strong><br>\n정해진 우선순위를 반복문 돌면서 <code class=\"language-text\">op</code> 리스트에서 해당 연산자가 우선순위인지 아닌지에 나눠서 처리<br>\n<strong>해당 연산자가 우선순위가 아닌 경우</strong> -> 그 연산자 뒤에 오는 숫자를 <code class=\"language-text\">temp_num</code>에, 해당 연산자를 <code class=\"language-text\">temp_op</code>에 <strong>append</strong><br>\n<strong>해당 연산자가 우선순위인 경우</strong> -> <code class=\"language-text\">temp_num</code> 스택에서 <strong>pop</strong>한 값과 연산자 뒤에 오는 숫자를 연산자에 맞게 계산하고 <code class=\"language-text\">temp_num</code>에 다시 <strong>append</strong></li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> copy\n<span class=\"token keyword\">from</span> itertools <span class=\"token keyword\">import</span> permutations\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">calculate</span><span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> o <span class=\"token keyword\">in</span> order<span class=\"token punctuation\">:</span>\n        temp_num <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>num<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n        temp_op <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> i<span class=\"token punctuation\">,</span> v <span class=\"token keyword\">in</span> <span class=\"token builtin\">enumerate</span><span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 연산자가 우선순위 아닌 경우</span>\n            <span class=\"token keyword\">if</span> v <span class=\"token operator\">!=</span> o<span class=\"token punctuation\">:</span> \n                temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>num<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 punctuation\">)</span>\n                temp_op<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">continue</span>\n            <span class=\"token comment\"># 연산자가 우선순위인 경우, 연산자에 따라 계산</span>\n            <span class=\"token keyword\">if</span> v <span class=\"token operator\">==</span> <span class=\"token string\">'+'</span><span class=\"token punctuation\">:</span> temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp_num<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> num<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 punctuation\">)</span>\n            <span class=\"token keyword\">elif</span> v <span class=\"token operator\">==</span> <span class=\"token string\">'-'</span><span class=\"token punctuation\">:</span> temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp_num<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> num<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 punctuation\">)</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> temp_num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp_num<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> num<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 punctuation\">)</span>\n        num <span class=\"token operator\">=</span> temp_num\n        op <span class=\"token operator\">=</span> temp_op\n    <span class=\"token keyword\">return</span> num<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>expression<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer<span class=\"token punctuation\">,</span> temp<span class=\"token punctuation\">,</span> last <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 number\">0</span>\n    op<span class=\"token punctuation\">,</span> num <span class=\"token operator\">=</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    <span class=\"token comment\"># 숫자, 연산자 분리</span>\n    <span class=\"token keyword\">for</span> e <span class=\"token keyword\">in</span> expression<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> e <span class=\"token operator\">==</span> <span class=\"token string\">'*'</span> <span class=\"token keyword\">or</span> e <span class=\"token operator\">==</span> <span class=\"token string\">'+'</span> <span class=\"token keyword\">or</span> e <span class=\"token operator\">==</span> <span class=\"token string\">'-'</span><span class=\"token punctuation\">:</span>\n            op<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n            num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp<span class=\"token punctuation\">)</span>\n            temp <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            temp <span class=\"token operator\">=</span> <span class=\"token number\">10</span> <span class=\"token operator\">*</span> temp\n            temp <span class=\"token operator\">+=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span>\n    num<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>temp<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># 순열 생성</span>\n    order_list <span class=\"token operator\">=</span> permutations<span class=\"token punctuation\">(</span><span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># op 중복 제거하고 순열 생성</span>\n    <span class=\"token keyword\">for</span> order <span class=\"token keyword\">in</span> order_list<span class=\"token punctuation\">:</span>\n        result <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>calculate<span class=\"token punctuation\">(</span>op<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">,</span> order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 계산 결과 절댓값으로 저장</span>\n        answer <span class=\"token operator\">=</span> <span class=\"token builtin\">max</span><span class=\"token punctuation\">(</span>answer<span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span>    <span class=\"token comment\"># 순열 반복하면서 최댓값 저장</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>연산자 우선순위를 정해야 한다고 해서 <code class=\"language-text\">permutations</code>를 이용해서 순열로 만들어야겠다고 생각하고 구현했다.<br>\n처음에는 반복문을 돌면서 인덱스를 이용해 리스트에서 값을 삭제하고 계산한 값을 넣는 방식으로 계산하는 부분을 구현하려고 했는데,<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>","excerpt":"[2020 카카오 인턴십] 문제 https://programmers.co.kr/learn/courses/30/lessons/67257 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다. 해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자() 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다. 단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉,  >  >  또는  >  >  등과 같이 연산자 우선순위를 정의할 수 있으나  >  또는  >  처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의할 수는 없습니다. 수식에 포함된 연산자가 2…","frontmatter":{"date":"April 28, 2022","title":"[Programmers] 67257번: 수식 최대화 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-67257/"}},"next":{"id":"3f765108-04e4-5f13-99c9-89236ea9e214","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/67256\">https://programmers.co.kr/learn/courses/30/lessons/67256</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: 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,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAADHUlEQVQ4y52US1NTZxjH/SCduqijOEhUgmAlgQAnF3JygdhFbZlxSjvTfonO9DO4dOW01dpwTTsiNATkXJIQICEkJAEMtNpFlzQZLlrDr3PeSCoEOoOL/5znvTy/eW7vOReKaBxqfFqt2cOTswSfzggNPZ0Vqq0nZ2t33/UxdO44zPgaiqfzpAqbJPNFFlc3hAw7VSgynynU+dQBa5FNPSO9VkTRNH786THBkTG+f/hIKDgyysPHQabC0yRz64xMzXHcvw44GlZY33qBXfbywUeXuNBoOqIPL17mRruVxXSWUEQ/PeVDjYVV8s+3cPcFuNr6MTfaO2i5ZcV8y0pLewfXb1qwdNuJJ9OEZs4A9AQ+ocvpptsl4/D4cXr92GWfsK09jrMD5b4A7V0Slh47Nqcbm6OXDslJp6MXS7fE/PsAe3o9OLx+EVU1yj6xfm+gVXLS5XLXZERqlOHMwJwA3hbpGTU8jOywhgYwnlz5H+C7Qx1W2NjcQu6/LYrfaXchyV4kt5culyzKYHR5MZXmlyNDrf4HHH9LH/pNYTm9QrmYFtEYACNVSfYJaI/bI/ZbLZ38uaSQTGcYejvc48dTHptWmZjVKBUWKOUTwtGIRsguI9llHHK1OQIYm6K0luTXiFr/9IzQh8IqqbhOJadSerGBwxegsbkFk7kN23d3aP02gKm5jaaWNm7aJF6uJKCgk4hqDIdVwTgZmNfY3sohefu5Ym6lydyG68E3OB98LWzj9ZitNv5Y0jhYi7FwGtDYTMY03uSjlHNxPH4/5xsauWxq5kLTVS42XaPB1Mz5hit4fT620wr/FKLM61XfurEZCavEdI29VQ2eL/Dz/Xv0fTrAwOBXfH53kM/uDjLwxZf03xngyQ/3YXOJnayGqlZ9Qyc1ZdJoSjYqoK9/z1CpVKgcHBzRQaXCq2JK3NnORHkyU/U94QdbPfhrWedVTmc3F2N/fZHdrMZeLsbeWoL9jST7xWV2VnVe56O8TOmMnvZSjIM5RWMnq7KbUdhJRSjPT1BShvn7WZCSOko5GqKcmBBnexmFckYlMqcdgf4LlTqANFKXLFgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"kakao_phone1.png\"\n        title=\"kakao_phone1.png\"\n        src=\"/static/95c419a520a2d198bc5013a353beba5c/37523/kakao_phone1.png\"\n        srcset=\"/static/95c419a520a2d198bc5013a353beba5c/e9ff0/kakao_phone1.png 180w,\n/static/95c419a520a2d198bc5013a353beba5c/f21e7/kakao_phone1.png 360w,\n/static/95c419a520a2d198bc5013a353beba5c/37523/kakao_phone1.png 720w,\n/static/95c419a520a2d198bc5013a353beba5c/00d43/kakao_phone1.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>이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.<br>\n맨 처음 왼손 엄지손가락은 <code class=\"language-text\">*</code> 키패드에 오른손 엄지손가락은 <code class=\"language-text\">#</code> 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.</p>\n<ol>\n<li>엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.</li>\n<li>왼쪽 열의 3개의 숫자 <code class=\"language-text\">1</code>, <code class=\"language-text\">4</code>, <code class=\"language-text\">7</code>을 입력할 때는 왼손 엄지손가락을 사용합니다.</li>\n<li>오른쪽 열의 3개의 숫자 <code class=\"language-text\">3</code>, <code class=\"language-text\">6</code>, <code class=\"language-text\">9</code>를 입력할 때는 오른손 엄지손가락을 사용합니다.</li>\n<li>가운데 열의 4개의 숫자 <code class=\"language-text\">2</code>, <code class=\"language-text\">5</code>, <code class=\"language-text\">8</code>, <code class=\"language-text\">0</code>을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.<br>\n4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.</li>\n</ol>\n<p>순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 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>numbers 배열의 크기는 1 이상 1,000 이하입니다.</li>\n<li>numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.</li>\n<li>hand는 <code class=\"language-text\">\"left\"</code> 또는 <code class=\"language-text\">\"right\"</code> 입니다.\n<ul>\n<li><code class=\"language-text\">\"left\"</code>는 왼손잡이, <code class=\"language-text\">\"right\"</code>는 오른손잡이를 의미합니다.</li>\n</ul>\n</li>\n<li>왼손 엄지손가락을 사용한 경우는 <code class=\"language-text\">L</code>, 오른손 엄지손가락을 사용한 경우는 <code class=\"language-text\">R</code>을 순서대로 이어붙여 문자열 형태로 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>numbers</th>\n<th>hand</th>\n<th>return</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]</td>\n<td>“right”</td>\n<td>“LRLLLRLLRRL”</td>\n</tr>\n<tr>\n<td>[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]</td>\n<td>“left”</td>\n<td>“LRLLRRLLLRR”</td>\n</tr>\n<tr>\n<td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]</td>\n<td>“right”</td>\n<td>“LLRLLRLLRL”</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔍 Algorithm</h2>\n<p><strong>구현</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">left<span class=\"token punctuation\">,</span> right <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\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span>    <span class=\"token comment\"># '*', '#' 좌표[x, y] 저장</span>\n<span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> numbers<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span> n <span class=\"token operator\">=</span> <span class=\"token number\">11</span>   <span class=\"token comment\"># 0은 계산 편하게 11로 저장</span>\n    x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</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 operator\">%</span><span class=\"token number\">3</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 operator\">//</span><span class=\"token number\">3</span>    <span class=\"token comment\"># 해당 숫자의 키패드 상 좌표 계산</span></code></pre></div>\n<ul>\n<li><strong>왼손, 오른손 위치 저장</strong><br>\n<code class=\"language-text\">left</code>, <code class=\"language-text\">right</code>에 현재 왼손, 오른손 위치 저장<br>\n시작 위치는 <code class=\"language-text\">*</code>, <code class=\"language-text\">#</code> 좌표[x, y] 저장</li>\n<li><strong>numbers에 있는 숫자만큼 반복문 진행</strong><br>\n키패드 상에 있는 위치에 맞게 <code class=\"language-text\">x = (n-1) % 3</code>, <code class=\"language-text\">y = (n-1) // 3</code> 계산<br>\n<code class=\"language-text\">n</code>이 <strong>0</strong>인 경우에는 계산하기 쉽게 키패드 위치처럼 <strong>11</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        <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">4</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">7</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n            left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">elif</span> n <span class=\"token operator\">==</span> <span class=\"token number\">3</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">6</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">9</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n            right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 왼손, 오른손 거리 계산</span>\n            left_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            right_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> left_dir <span class=\"token operator\">&lt;</span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span>y<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">elif</span> left_dir <span class=\"token operator\">></span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n            <span class=\"token comment\"># 거리가 같으면 hand 값에 따라서 처리</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> hand <span class=\"token operator\">==</span> <span class=\"token string\">\"left\"</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                    left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                    right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span></code></pre></div>\n<ul>\n<li><strong>키패드 위치에 따라 나눠서 처리</strong><br>\n<code class=\"language-text\">n</code>이 <strong>2, 5, 8, 0</strong>인 경우에는 <code class=\"language-text\">left</code>, <code class=\"language-text\">right</code> 값과의 거리를 계산해서<br>\n왼손이 가까우면 왼손으로, 오른손이 가까우면 오른손으로 처리<br>\n거리가 같으면 <code class=\"language-text\">hand</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\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">,</span> hand<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token string\">''</span>\n    left<span class=\"token punctuation\">,</span> right <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\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span>    <span class=\"token comment\"># '*', '#' 좌표[x, y] 저장</span>\n    <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> numbers<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span> n <span class=\"token operator\">=</span> <span class=\"token number\">11</span>   <span class=\"token comment\"># 0은 계산 편하게 11로 저장</span>\n        x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</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 operator\">%</span><span class=\"token number\">3</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 operator\">//</span><span class=\"token number\">3</span>    <span class=\"token comment\"># 해당 숫자의 키패드 상 좌표 계산</span>\n        <span class=\"token comment\"># 키패드 위치에 따라 나눠서 처리</span>\n        <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">4</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">7</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n            left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">elif</span> n <span class=\"token operator\">==</span> <span class=\"token number\">3</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">6</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">9</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n            right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 왼손, 오른손 거리 계산</span>\n            left_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            right_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> left_dir <span class=\"token operator\">&lt;</span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span>y<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">elif</span> left_dir <span class=\"token operator\">></span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n            <span class=\"token comment\"># 거리가 같으면 hand 값에 따라서 처리</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> hand <span class=\"token operator\">==</span> <span class=\"token string\">\"left\"</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                    left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                    right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<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간단하게 구현하면 되는 문제였는데 조건문이 많아져서 코드는 안이쁜 것 같음,,</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":"April 28, 2022","title":"[Programmers] 67256번: 키패드 누르기 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-67256/"}},"prev":{"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/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/pg-67257/","nextSlug":"/pg-67256/","prevSlug":"/pg-67258/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}