{"componentChunkName":"component---src-templates-blog-post-js","path":"/Algorithm/BOJ-1074-Python/","result":{"data":{"site":{"siteMetadata":{"title":"hyesungoh","author":"hyesungoh","siteUrl":"https://www.hyesungoh.xyz","comment":{"disqusShortName":"","utterances":"hyesungoh/blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"7d04a0d4-e12d-5772-99fc-f6dd9e04afde","excerpt":"n, r, c를 입력받은 후 2^N * 2^N 크기의 배열을 Z모양으로 탐색할 때, 쪽 위에 있는 칸이 하나가 아니라면, 배열을 4등분 한 후에 (크기가 같은 2^(N-1)로) 재귀적으로 순서대로 방문하면 (r, c)를 몇 번째로 방문하는지 출력하는 문제. 첫 풀이는 배열의 크기, 좌표…","html":"<p>n, r, c를 입력받은 후 2^N * 2^N 크기의 배열을 Z모양으로 탐색할 때, 쪽 위에 있는 칸이 하나가 아니라면, 배열을 4등분 한 후에 (크기가 같은 2^(N-1)로) 재귀적으로 순서대로 방문하면 (r, c)를 몇 번째로 방문하는지 출력하는 문제. 첫 풀이는 배열의 크기, 좌표 4등분을 재귀적으로 사용하는 함수를 구현하여 풀었으나 런타임 에러 결과를 받게 되었다. 재귀의 제한을 늘리니 메모리 초과 결과를 받게 되었다. 두번째 풀이는 목표 좌표가 어느 사분면에 있는 지 계산하여 다른 사분면의 크기만큼 더하는 것과 배열의 크기를 줄이는 것을 반복하여 풀었다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># 1074</span>\n<span class=\"token comment\"># import sys</span>\n<span class=\"token comment\"># sys.setrecursionlimit(100000)</span>\n<span class=\"token comment\"># n, r, c = map(int, input().split())</span>\n<span class=\"token comment\"># count = 0</span>\n<span class=\"token comment\"># def z(N, x, y):</span>\n<span class=\"token comment\">#     global count</span>\n<span class=\"token comment\">#     if N == 2:</span>\n<span class=\"token comment\">#         if x == r and y == c:</span>\n<span class=\"token comment\">#             print(count)</span>\n<span class=\"token comment\">#             return</span>\n<span class=\"token comment\">#         count += 1</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if x + 1 == r and y == c:</span>\n<span class=\"token comment\">#             print(count)</span>\n<span class=\"token comment\">#             return</span>\n<span class=\"token comment\">#         count += 1</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if x == r and y + 1 == c:</span>\n<span class=\"token comment\">#             print(count)</span>\n<span class=\"token comment\">#             return</span>\n<span class=\"token comment\">#         count += 1</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if x + 1 == r and y + 1 == c:</span>\n<span class=\"token comment\">#             print(count)</span>\n<span class=\"token comment\">#             return</span>\n<span class=\"token comment\">#         count += 1</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#     else:</span>\n<span class=\"token comment\">#         z(N//2, y, x)</span>\n<span class=\"token comment\">#         z(N//2, y, x+N//2)</span>\n<span class=\"token comment\">#         z(N//2, y+N//2, x)</span>\n<span class=\"token comment\">#         z(N//2, y+N//2, x+N//2)</span>\n<span class=\"token comment\"># z(n*n, 0, 0)</span>\n\nn<span class=\"token punctuation\">,</span> r<span class=\"token punctuation\">,</span> c <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>\ncount <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n<span class=\"token keyword\">while</span> n <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 목표 좌표가 2사분면일 때</span>\n        <span class=\"token keyword\">if</span> r <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token keyword\">and</span> c <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 오른쪽 위</span>\n            count <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">elif</span> r <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">and</span> c <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 아래</span>\n            count <span class=\"token operator\">+=</span> <span class=\"token number\">2</span>\n        <span class=\"token keyword\">elif</span> r <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">and</span> c <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 오른쪽 아래</span>\n            count <span class=\"token operator\">+=</span> <span class=\"token number\">3</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> <span class=\"token comment\"># 목표 좌표가 사</span>\n        temp <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">2</span> <span class=\"token operator\">**</span> n<span class=\"token punctuation\">)</span> <span class=\"token operator\">//</span> <span class=\"token number\">2</span>  <span class=\"token comment\"># 현재 n의 배열 크기 ex) 2 == 4, 3 == 8</span>\n        <span class=\"token keyword\">if</span> temp <span class=\"token operator\">></span> r <span class=\"token keyword\">and</span> temp <span class=\"token operator\">&lt;=</span> c<span class=\"token punctuation\">:</span> <span class=\"token comment\"># 목표 좌표가 1사분면에 있을 때</span>\n            count <span class=\"token operator\">+=</span> temp <span class=\"token operator\">**</span> <span class=\"token number\">2</span> <span class=\"token comment\"># 2사분면의 크기만큼 더함</span>\n            c <span class=\"token operator\">-=</span> temp <span class=\"token comment\"># 다음 반복에서 계산을 위해</span>\n        <span class=\"token keyword\">elif</span> temp <span class=\"token operator\">&lt;=</span> r <span class=\"token keyword\">and</span> temp <span class=\"token operator\">></span> c<span class=\"token punctuation\">:</span> <span class=\"token comment\"># 목표 좌표가 3사분면에 있을 때</span>\n            count <span class=\"token operator\">+=</span> <span class=\"token punctuation\">(</span>temp <span class=\"token operator\">**</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">2</span> <span class=\"token comment\"># 1, 2사분면의 크기만큼 더함</span>\n            r <span class=\"token operator\">-=</span> temp <span class=\"token comment\"># 다음 반복에서 계산을 위해</span>\n        <span class=\"token keyword\">elif</span> temp <span class=\"token operator\">&lt;=</span> r <span class=\"token keyword\">and</span> temp <span class=\"token operator\">&lt;=</span> c<span class=\"token punctuation\">:</span> <span class=\"token comment\"># 목표 좌표가 4분면에 있을 때</span>\n            count <span class=\"token operator\">+=</span> <span class=\"token punctuation\">(</span>temp <span class=\"token operator\">**</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">3</span> <span class=\"token comment\"># 1, 2, 3사분면의 크기만큼 더함</span>\n            r <span class=\"token operator\">-=</span> temp <span class=\"token comment\"># 다음 반복에서 계산을 위해</span>\n            c <span class=\"token operator\">-=</span> temp\n    n <span class=\"token operator\">-=</span> <span class=\"token number\">1</span> <span class=\"token comment\"># 현재 배열을 4등분 n = 3, temp = 8 > n = 2, temp = 4</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>count<span class=\"token punctuation\">)</span></code></pre></div>","frontmatter":{"title":"BOJ-1074 - Python","date":"October 12, 2020"}}},"pageContext":{"slug":"/Algorithm/BOJ-1074-Python/","previous":{"fields":{"slug":"/Algorithm/BOJ-10798-Python/"},"frontmatter":{"title":"BOJ-10798 - Python","category":"Algorithm","draft":false}},"next":{"fields":{"slug":"/Algorithm/BOJ-1913-Python/"},"frontmatter":{"title":"BOJ-1913 - Python","category":"Algorithm","draft":false}}}},"staticQueryHashes":["3128451518","3290666882"]}