Notion에서 작성한 글이라, 여기에서 더 깔끔하게 보실 수 있습니다! 😮😊
itertools
를 이용하지 않고 구현해봐야겠다고 생각했던 permutations 문제였다.discard
할 경우 discard
되지 말아야 할 좌표가 discard
되어버리는 문제가 발생했다.discard
하는 과정에서 칸 에 의해 생성된 건너뛸 대각선 좌표들이 지워져버리는 문제)try-except
+ remove
를 이용하여 해결하려고 했다. 집합에 원소가 없는 상태에서 remove
가 실행되면 KeyError
가 발생하기 때문에 KeyError
가 발생할 때(두 번 이상 삭제될 때) 따로 그 좌표들을 모아놓고 마지막에 다시 집합에 추가시켜주는 방법이다. 또는 if e in set: discard
, else: add
를 이용할 수도 있겠다.def solution(n):
# return [1, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200][n]
i_pass = set()
j_pass = set()
selected = set()
ret = [0]
def diag_check(i, j):
for s in selected:
if abs(i-s[0]) == abs(j-s[1]): return False
return True
def check_control(i, j, f):
if f:
selected.add((i, j))
i_pass.add(i)
j_pass.add(j)
else:
selected.discard((i, j))
i_pass.discard(i)
j_pass.discard(j)
def _q(k):
if k == n:
ret[0] += 1
return
for i in range(n):
if i in i_pass: continue
for j in range(n):
if j in j_pass or not diag_check(i, j): continue
check_control(i, j, True)
_q(k+1)
check_control(i, j, False)
if k < i+1: return
_q(0)
return ret[0]