{"componentChunkName":"component---src-templates-blog-post-js","path":"/algorithm/programmers_69/","result":{"data":{"site":{"siteMetadata":{"title":"Ykss","author":"[Ykss]","siteUrl":"https://ykss.netlify.app","comment":{"disqusShortName":"","utterances":"ykss/ykss.netlify.com"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"89bfbdda-d383-5e28-a171-dd6aa2e14fba","excerpt":"문제 설명 본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다. 개발자 출신으로 세계 최고의 갑부가 된 어피치는 스트레스를 받을 때면 이를 풀기 위해 오프라인 매장에 쇼핑을 하러 가곤 합니다.\n어피치는 쇼핑을 할 때면 매장 진열대의 특정 범위의 물건들을 모두 싹쓸이 구매하는 습관이 있습니다.\n어느 날 스트레스를 풀기 위해 보석 매장에 쇼핑을 하러 간 어피치는 이전처럼 진열대의 특정 범위의 보석을 모두 구매하되 특별히 아래 목적을 달성하고 싶었습니다.\n진열된 모든 종류의 보석을 적어도…","html":"<h3 id=\"문제-설명\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C-%EC%84%A4%EB%AA%85\" 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>문제 설명</h3>\n<p>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</p>\n<p>개발자 출신으로 세계 최고의 갑부가 된 어피치는 스트레스를 받을 때면 이를 풀기 위해 오프라인 매장에 쇼핑을 하러 가곤 합니다.\n어피치는 쇼핑을 할 때면 매장 진열대의 특정 범위의 물건들을 모두 싹쓸이 구매하는 습관이 있습니다.\n어느 날 스트레스를 풀기 위해 보석 매장에 쇼핑을 하러 간 어피치는 이전처럼 진열대의 특정 범위의 보석을 모두 구매하되 특별히 아래 목적을 달성하고 싶었습니다.\n진열된 모든 종류의 보석을 적어도 1개 이상 포함하는 가장 짧은 구간을 찾아서 구매</p>\n<p>예를 들어 아래 진열대는 4종류의 보석(RUBY, DIA, EMERALD, SAPPHIRE) 8개가 진열된 예시입니다.</p>\n<p>진열대 번호 1 2 3 4 5 6 7 8\n보석 이름 DIA RUBY RUBY DIA DIA EMERALD SAPPHIRE DIA\n진열대의 3번부터 7번까지 5개의 보석을 구매하면 모든 종류의 보석을 적어도 하나 이상씩 포함하게 됩니다.</p>\n<p>진열대의 3, 4, 6, 7번의 보석만 구매하는 것은 중간에 특정 구간(5번)이 빠지게 되므로 어피치의 쇼핑 습관에 맞지 않습니다.</p>\n<p>진열대 번호 순서대로 보석들의 이름이 저장된 배열 gems가 매개변수로 주어집니다. 이때 모든 보석을 하나 이상 포함하는 가장 짧은 구간을 찾아서 return 하도록 solution 함수를 완성해주세요.\n가장 짧은 구간의 시작 진열대 번호와 끝 진열대 번호를 차례대로 배열에 담아서 return 하도록 하며, 만약 가장 짧은 구간이 여러 개라면 시작 진열대 번호가 가장 작은 구간을 return 합니다.</p>\n<h3 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>[제한사항]</h3>\n<p>gems 배열의 크기는 1 이상 100,000 이하입니다.\ngems 배열의 각 원소는 진열대에 나열된 보석을 나타냅니다.\ngems 배열에는 1번 진열대부터 진열대 번호 순서대로 보석이름이 차례대로 저장되어 있습니다.\ngems 배열의 각 원소는 길이가 1 이상 10 이하인 알파벳 대문자로만 구성된 문자열입니다.</p>\n<h3 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>입출력 예</h3>\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<h3 id=\"내-코드-시간초과\" style=\"position:relative;\"><a href=\"#%EB%82%B4-%EC%BD%94%EB%93%9C-%EC%8B%9C%EA%B0%84%EC%B4%88%EA%B3%BC\" 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>내 코드 (시간초과)</h3>\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>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    duplicate <span class=\"token operator\">=</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span>\n    count <span class=\"token operator\">=</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>duplicate<span class=\"token punctuation\">)</span>\n    results <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>count<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 operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">:</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> duplicate <span class=\"token punctuation\">:</span>\n                results<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">break</span>\n    results<span class=\"token punctuation\">.</span>sort<span class=\"token punctuation\">(</span>key <span class=\"token operator\">=</span> <span class=\"token keyword\">lambda</span> x <span class=\"token punctuation\">:</span> <span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> results<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>중복을 제거한 목록을 <code class=\"language-text\">duplicate</code>에 넣고, <code class=\"language-text\">gems</code>배열의 첫번째 인덱스부터 모든 보석이 등장하는 인덱스까지의 경우를 <code class=\"language-text\">results</code>배열에 넣고 구한 경우들 중에서 그 길이가 가장 짧은 것을 구하기 위해서 <code class=\"language-text\">sort()</code>에 lambda로 기준을 정하여 정렬하고, 가장 짧은 길이의 것을 리턴하였다. 정답은 나왔지만 테스트 케이스 15개 중에 2개가 시간초과로 실패했다. 아무래도 이중 for문 때문에 효율성이 좀 떨어지는 부분이 있는 것 같다. 그리고 효율성 테스트도 모두 실패한 결과가 나왔다.</p>\n<h3 id=\"다른-답안을-참고한-풀이\" style=\"position:relative;\"><a href=\"#%EB%8B%A4%EB%A5%B8-%EB%8B%B5%EC%95%88%EC%9D%84-%EC%B0%B8%EA%B3%A0%ED%95%9C-%ED%92%80%EC%9D%B4\" 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>다른 답안을 참고한 풀이</h3>\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>gems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    gems_dict <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>gems<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token number\">1</span><span class=\"token punctuation\">}</span>\n    gems_count <span class=\"token operator\">=</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span>\n    type_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>\n    start<span class=\"token punctuation\">,</span> end <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span>\n    result <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\">100001</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">while</span> start <span class=\"token operator\">&lt;</span> gems_count <span class=\"token keyword\">and</span> end <span class=\"token operator\">&lt;</span> gems_count <span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems_dict<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> type_count <span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> end <span class=\"token operator\">==</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>gems<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">break</span>\n            end <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n            <span class=\"token keyword\">if</span> gems_dict<span class=\"token punctuation\">.</span>get<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 keyword\">is</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">:</span>\n                gems_dict<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 keyword\">else</span><span class=\"token punctuation\">:</span>\n                gems_dict<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 keyword\">else</span> <span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> end <span class=\"token operator\">-</span> start <span class=\"token operator\">&lt;</span> result<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> result<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                result <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</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><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> gems_dict<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><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">del</span> gems_dict<span class=\"token punctuation\">[</span>gems<span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                gems_dict<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            start <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n\n    <span class=\"token keyword\">return</span> result</code></pre></div>\n<p>이 풀이의 핵심은 딕셔너리의 활용과 <code class=\"language-text\">start</code>와 <code class=\"language-text\">end</code>의 활용이다. 먼저 처음 인덱스꺼를 딕셔너리에 추가하고, 시작과 끝 지점을 0으로 해서 시작한다. <code class=\"language-text\">while</code> 반복문을 시작과 끝이 모두 주어진 배열의 길이보다 작을 때까지는 계속 반복하도록 돌리고, 만약에 딕셔너리의 길이가 보석 종류의 수보다 작으면 끝 포인터를 늘려서 끝 포인터가 딕셔너리에 없으면 추가하고, 있으면 +1 하도록 했다. 만약 딕셔너리의 길이가 종류의 수와 같으면 끝에서 시작지점을 뺀 것이 <code class=\"language-text\">result</code>에서 계산한 거리보다 가까우면 <code class=\"language-text\">result</code>를 갱신하도록 했다. 그리고 만약에 딕셔너리의 시작점이 이미 추가되어있으면 딕셔너리에서 지우고, 아니면 -1을 하도록 했다. 이런식으로 <code class=\"language-text\">start</code> 값을 늘려가면서 <code class=\"language-text\">result</code>를 갱신하여 답을 구한다. 이 방식으로하면 효율성테스트도 모두 통과 할 수 있다.</p>","frontmatter":{"title":"[프로그래머스] 보석쇼핑 - 파이썬","date":"April 22, 2021","thumbnail":null,"canonicalUrl":null}}},"pageContext":{"slug":"/algorithm/programmers_69/","previous":{"fields":{"slug":"/algorithm/programmers_68/"},"frontmatter":{"title":"[프로그래머스] 수식 최대화 - 파이썬"}},"next":{"fields":{"slug":"/algorithm/programmers_70/"},"frontmatter":{"title":"[프로그래머스] 경주로 건설 - 파이썬"}}}},"staticQueryHashes":["1873090088","3128451518"]}