{"componentChunkName":"component---src-templates-blog-post-js","path":"/Algorithm/BOJ-9663-Python/","result":{"data":{"site":{"siteMetadata":{"title":"hyesungoh","author":"hyesungoh","siteUrl":"https://www.hyesungoh.xyz","comment":{"disqusShortName":"","utterances":"hyesungoh/blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"154bce5f-68f7-501f-8b2a-30dfdc7c9e3f","excerpt":"n 크기의 체스판에서 n개의 퀸이 있을 때 서로 공격할 수 없는 자리의 경우의 수를 출력하는 문제. 첫 풀이는 False로 이루어진 2차원 배열을 사용하였다. 2중 반복문을 수행하고 False일 때 해당하는 상하좌우와 대각선을 체크해주는 함수를 만들어 값을 변환시킨 후 재귀적으로 호출하였다. 하지만 이 방법은 성공한 풀이가 되지 못했다. 값을 false로 바꿀 때 현재 반복중인 퀸이 체크한 부분만 false를 해야하는데 해당 방법을 해결하지 못했다. 두번째 풀이는 좌표를 압축하여 사용할 3가지…","html":"<p>[n][n] 크기의 체스판에서 n개의 퀸이 있을 때 서로 공격할 수 없는 자리의 경우의 수를 출력하는 문제. 첫 풀이는 False로 이루어진 2차원 배열을 사용하였다. 2중 반복문을 수행하고 False일 때 해당하는 상하좌우와 대각선을 체크해주는 함수를 만들어 값을 변환시킨 후 재귀적으로 호출하였다. 하지만 이 방법은 성공한 풀이가 되지 못했다. 값을 false로 바꿀 때 현재 반복중인 퀸이 체크한 부분만 false를 해야하는데 해당 방법을 해결하지 못했다. 두번째 풀이는 좌표를 압축하여 사용할 3가지 1차원 배열을 만들었다. 대각선 배열의 길이는 2*n-1의 수식을 사용하였다. 백트래킹의 기본적인 부분은 똑같으나 n과 비교하는 depth를 하나의 행으로 사용하며 해당 대각선을 계산하는 공식이 나는 유추해내지 못했을 것 같다. 오른쪽 위로 향하는 대각선은 depth + 현재 반복 인자인 i이며 왼쪽 위의 인덱스가 0이다. 오른쪽 아래로 향하는 대각선은 depth - i + n - 1의 수식을 사용하며 오른쪽 위의 인덱스가 0이… 더 열심히 해야겠다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># import sys</span>\n<span class=\"token comment\"># input = sys.stdin.readline</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># n = int(input())</span>\n<span class=\"token comment\"># ans = 0</span>\n<span class=\"token comment\"># l = [[False for _ in range(n)] for _ in range(n)]</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># def bt(depth):</span>\n<span class=\"token comment\">#     global ans</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#     if n == depth:</span>\n<span class=\"token comment\">#         ans += 1</span>\n<span class=\"token comment\">#         return</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#     for i in range(n):</span>\n<span class=\"token comment\">#         for j in range(n):</span>\n<span class=\"token comment\">#             if not l[i][j]:</span>\n<span class=\"token comment\">#                 check_true(l, i, j)</span>\n<span class=\"token comment\">#                 bt(depth+1)</span>\n<span class=\"token comment\">#                 check_false(l, i, j)</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># def check_true(l, i, j):</span>\n<span class=\"token comment\">#     for y in range(n): # 직선 체크</span>\n<span class=\"token comment\">#         if 0 &lt;= y &lt; n:</span>\n<span class=\"token comment\">#             l[y][j] = True</span>\n<span class=\"token comment\">#             l[i][y] = True</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if 0 &lt;= i-y &lt; n and 0 &lt;= j-y &lt; n:</span>\n<span class=\"token comment\">#             l[i - y][j - y] = True</span>\n<span class=\"token comment\">#         if 0 &lt;= i+y &lt; n and 0 &lt;= j+y &lt; n:</span>\n<span class=\"token comment\">#             l[i + y][j + y] = True</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if 0 &lt;= i-y &lt; n and 0 &lt;= j+y &lt; n:</span>\n<span class=\"token comment\">#             l[i - y][j + y] = True</span>\n<span class=\"token comment\">#         if 0 &lt;= i+y &lt; n and 0 &lt;= j-y &lt; n:</span>\n<span class=\"token comment\">#             l[i + y][j - y] = True</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># def check_false(l, i, j):</span>\n<span class=\"token comment\">#     for y in range(n): # 직선 체크</span>\n<span class=\"token comment\">#         if 0 &lt;= y &lt; n:</span>\n<span class=\"token comment\">#             l[y][j] = False</span>\n<span class=\"token comment\">#             l[i][y] = False</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if 0 &lt;= i-y &lt; n and 0 &lt;= j-y &lt; n:</span>\n<span class=\"token comment\">#             l[i - y][j - y] = False</span>\n<span class=\"token comment\">#         if 0 &lt;= i+y &lt; n and 0 &lt;= j+y &lt; n:</span>\n<span class=\"token comment\">#             l[i + y][j + y] = False</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\">#         if 0 &lt;= i-y &lt; n and 0 &lt;= j+y &lt; n:</span>\n<span class=\"token comment\">#             l[i - y][j + y] = False</span>\n<span class=\"token comment\">#         if 0 &lt;= i+y &lt; n and 0 &lt;= j-y &lt;n:</span>\n<span class=\"token comment\">#             l[i + y][j - y] = False</span>\n<span class=\"token comment\">#</span>\n<span class=\"token comment\"># bt(0)</span>\n<span class=\"token comment\"># print(ans)</span>\n\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\n\nn <span class=\"token operator\">=</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>\nans <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\nst <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> n\n<span class=\"token comment\"># 대각선 좌표를 압축하여 저장하기 위해 최대 길이 설장 ex) 3 = 4, 4 = 6, 5 = 8</span>\npl <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">]</span> <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 operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\nmi <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token boolean\">False</span><span class=\"token punctuation\">]</span> <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 operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">bt</span><span class=\"token punctuation\">(</span>depth<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">global</span> ans\n\n    <span class=\"token keyword\">if</span> depth <span class=\"token operator\">==</span> n<span class=\"token punctuation\">:</span>\n        ans <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n        <span class=\"token keyword\">return</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>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># pl은 오른쪽 위로 향하는 대각선, 왼쪽 위의 인덱스가 0</span>\n        <span class=\"token comment\"># mi는 오른쪽 아래로 향하는 대각선, 오른쪽 위의 인덱스가 0</span>\n        <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> st<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> <span class=\"token keyword\">not</span> pl<span class=\"token punctuation\">[</span>depth<span class=\"token operator\">+</span>i<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> <span class=\"token keyword\">not</span> mi<span class=\"token punctuation\">[</span>depth<span class=\"token operator\">-</span>i<span class=\"token operator\">+</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n            st<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> pl<span class=\"token punctuation\">[</span>depth<span class=\"token operator\">+</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> mi<span class=\"token punctuation\">[</span>depth<span class=\"token operator\">-</span>i<span class=\"token operator\">+</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 boolean\">True</span>\n            bt<span class=\"token punctuation\">(</span>depth<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n            st<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> pl<span class=\"token punctuation\">[</span>depth <span class=\"token operator\">+</span> i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> mi<span class=\"token punctuation\">[</span>depth <span class=\"token operator\">-</span> i <span class=\"token operator\">+</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 boolean\">False</span>\n\nbt<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>ans<span class=\"token punctuation\">)</span></code></pre></div>","frontmatter":{"title":"BOJ-9663 - Python","date":"October 20, 2020"}}},"pageContext":{"slug":"/Algorithm/BOJ-9663-Python/","previous":{"fields":{"slug":"/Algorithm/BOJ-1149-Python/"},"frontmatter":{"title":"BOJ-1149 - Python","category":"Algorithm","draft":false}},"next":{"fields":{"slug":"/Algorithm/BOJ-2522-Python/"},"frontmatter":{"title":"BOJ-2522 - Python","category":"Algorithm","draft":false}}}},"staticQueryHashes":["3128451518","3290666882"]}