{"componentChunkName":"component---src-templates-blog-post-js","path":"/Algorithm/BOJ-12851-Python/","result":{"data":{"site":{"siteMetadata":{"title":"hyesungoh","author":"hyesungoh","siteUrl":"https://www.hyesungoh.xyz","comment":{"disqusShortName":"","utterances":"hyesungoh/blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"61ef3f7a-3cfc-59d4-9d7e-02d4dfeae3e4","excerpt":"현재 위치 n과 이동해야 할 목적지 k가 주어질 때, 1초 후에 n+1, n-1, n*2로 이동할 수 있다. 이 때 k까지 가는 최소 시간을 출력하고 동일한 시간으로 갈 수 있는 방법의 수까지 출력하는 문제. 최소 시간은 간단히 풀었으나 방법까지 구하는 데 시간이 상당히 소요되었다. 첫 풀이는 시간을 기준으로 힙연산을 통해 풀었으나 시간초과 결과를 받게 되었다. 두번째 풀이는 bfs 연산을 하였으며 방문확인으로…","html":"<p>현재 위치 n과 이동해야 할 목적지 k가 주어질 때, 1초 후에 n+1, n-1, n*2로 이동할 수 있다. 이 때 k까지 가는 최소 시간을 출력하고 동일한 시간으로 갈 수 있는 방법의 수까지 출력하는 문제. 최소 시간은 간단히 풀었으나 방법까지 구하는 데 시간이 상당히 소요되었다. 첫 풀이는 시간을 기준으로 힙연산을 통해 풀었으나 시간초과 결과를 받게 되었다. 두번째 풀이는 bfs 연산을 하였으며 방문확인으로 0으로 이루어진 리스트를 사용했다. 목적지에 처음 방문 했을 때 방문 리스트에 현재 소모된 시간을 저장하였으며, 첫 방문이 아니며 시간이 똑같을 때는 횟수를 저장하는 정수형 변수 ans의 값을 추가해 주었다. 그리고 큐에 추가하는 연산을 실행할 때, 첫 방문 혹은 방문지에 저장된 시간이 다음에 저장될 시간보다 클 때 추가하였다. 목적지에 저장된 값 그리고 다음 연산될 시간이 다음 값에 저장된 값보다 클 때를 예외처리 하여 풀었다. 자세한 풀이는 주석에 설명해 놓았다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># 12851</span>\n<span class=\"token comment\"># import heapq</span>\n<span class=\"token comment\"># import sys</span>\n<span class=\"token comment\"># INF = sys.maxsize</span>\n<span class=\"token comment\"># input = sys.stdin.readline</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># def bfs(start):</span>\n<span class=\"token comment\">#     q = []</span>\n<span class=\"token comment\">#     heapq.heappush(q, [0, start])</span>\n<span class=\"token comment\">#     ans = [0, INF]</span>\n<span class=\"token comment\">#     while q:</span>\n<span class=\"token comment\">#         sec, place = heapq.heappop(q)</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if place == k:</span>\n<span class=\"token comment\">#             ans[0] += 1</span>\n<span class=\"token comment\">#             ans[1] = sec</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if sec > ans[1]:</span>\n<span class=\"token comment\">#             return ans</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if 0 &lt; sec + 1 &lt;= 100000:</span>\n<span class=\"token comment\">#             heapq.heappush(q, [sec + 1, place + 1])</span>\n<span class=\"token comment\">#             heapq.heappush(q, [sec + 1, place - 1])</span>\n<span class=\"token comment\">#             heapq.heappush(q, [sec + 1, place * 2])</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># n, k = map(int, input().split())</span>\n<span class=\"token comment\"># ans = bfs(n)</span>\n<span class=\"token comment\"># print(ans[1])</span>\n<span class=\"token comment\"># print(ans[0])</span>\n\n<span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> deque\n<span class=\"token keyword\">import</span> sys\n<span class=\"token builtin\">input</span> <span class=\"token operator\">=</span> sys<span class=\"token punctuation\">.</span>stdin<span class=\"token punctuation\">.</span>readline\nMAX <span class=\"token operator\">=</span> <span class=\"token number\">100001</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">bfs</span><span class=\"token punctuation\">(</span>start<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    q <span class=\"token operator\">=</span> deque<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span>start<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    ans <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n    <span class=\"token keyword\">while</span> q<span class=\"token punctuation\">:</span>\n        place<span class=\"token punctuation\">,</span> sec <span class=\"token operator\">=</span> q<span class=\"token punctuation\">.</span>popleft<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n        <span class=\"token keyword\">if</span> place <span class=\"token operator\">==</span> k<span class=\"token punctuation\">:</span> <span class=\"token comment\"># 현재 목표 지점일 때</span>\n            <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> visit<span class=\"token punctuation\">[</span>place<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 첫 방문일 때</span>\n                visit<span class=\"token punctuation\">[</span>place<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> sec <span class=\"token comment\"># 현재 시간을 저장</span>\n                ans <span class=\"token operator\">+=</span> <span class=\"token number\">1</span> <span class=\"token comment\"># 카운트 변수에 +1</span>\n            <span class=\"token keyword\">elif</span> sec <span class=\"token operator\">==</span> visit<span class=\"token punctuation\">[</span>place<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 첫방문은 아니지만 시간이 같을 때</span>\n                ans <span class=\"token operator\">+=</span> <span class=\"token number\">1</span> <span class=\"token comment\"># 카운트 변수에 +1</span>\n\n        <span class=\"token keyword\">for</span> <span class=\"token builtin\">next</span> <span class=\"token keyword\">in</span> <span class=\"token punctuation\">[</span>place<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> place<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> place<span class=\"token operator\">*</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> <span class=\"token builtin\">next</span> <span class=\"token operator\">&lt;</span> MAX<span class=\"token punctuation\">:</span> <span class=\"token comment\"># 범위를 안넘었을 때</span>\n                <span class=\"token comment\"># 다음으로 갈 곳이 첫 방문 혹은 배정될 시간보다 클 때</span>\n                <span class=\"token keyword\">if</span> visit<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token keyword\">or</span> visit<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>=</span> sec<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token comment\"># 목적지에 저장된 값과 배정될 시간이 다음으로 갈 곳에 저장된 값보다 크면?</span>\n                    <span class=\"token keyword\">if</span> visit<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> sec<span class=\"token operator\">+</span><span class=\"token number\">1</span> <span class=\"token operator\">></span> visit<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                        <span class=\"token comment\"># 큐에 추가를 안하여 시간 단축</span>\n                        <span class=\"token comment\"># 목적지의 시간과 다음에 연산될 시긴이 더 크면 연산이 불필요하기 때문</span>\n                        <span class=\"token keyword\">continue</span>\n\n                    visit<span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> sec <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n                    q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">next</span><span class=\"token punctuation\">,</span> sec<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>visit<span class=\"token punctuation\">[</span>place<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>ans<span class=\"token punctuation\">)</span>\n\nn<span class=\"token punctuation\">,</span> k <span class=\"token operator\">=</span> <span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">input</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nvisit <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span> <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>MAX<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">if</span> n <span class=\"token operator\">>=</span> k<span class=\"token punctuation\">:</span> <span class=\"token comment\"># 처음 시작 지점이 목표 지점보다 같거나 클 때</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span>k<span class=\"token punctuation\">)</span> <span class=\"token comment\"># 시작 지점 - 목표 지점 (동일 시 0)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># -1되는 방법밖에 없음 (동일 시는 아무 연산 안하는 방법 1개)</span>\n    exit<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 프로그램 종료</span>\n\nbfs<span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span></code></pre></div>","frontmatter":{"title":"BOJ-12851 - Python","date":"November 04, 2020"}}},"pageContext":{"slug":"/Algorithm/BOJ-12851-Python/","previous":{"fields":{"slug":"/Algorithm/BOJ-2851-Python/"},"frontmatter":{"title":"BOJ-2851 - Python","category":"Algorithm","draft":false}},"next":{"fields":{"slug":"/Algorithm/BOJ-16953-Python/"},"frontmatter":{"title":"BOJ-16953 - Python","category":"Algorithm","draft":false}}}},"staticQueryHashes":["3128451518","3290666882"]}