DFS로 모든 경우의 수를 체크해주면 된다.
- 2N+1 길이 arr 배열을 만든다. (default = 0)
- 해당 숫자를 사용했는지 안했는지 체크하는 N+1 길이 used 배열을 만든다.
- X와 Y자리 숫자는 항상 같으므로 arr[X] = arr[Y] = Y-X-1 로 설정한다.
- dfs함수를 통해 x가 2N+1이라면 수열이 완성된것이므로 count해준다.
- arr[x]가 0이 아니라면 이미 숫자가 들어있으므로 다음칸을 계산하는 dfs(x+1)을 실행한다.
- 숫자가 들어있지 않다면 사용하지 않은 숫자(j) 중에서 arr[x+j+1]에도 숫자가 들어있지 않다면 해당 숫자를 사용한다.
import sys
input = sys.stdin.readline
N, X, Y = map(int, input().split())
used = [False]*(N+1)
arr = [0]*(2*N+1)
used[Y-X-1] = True
arr[X] = Y-X-1
arr[Y] = Y-X-1
answer = 0
def dfs(x):
global answer
if x == 2*N+1:
answer += 1
return
if arr[x] != 0:
dfs(x+1)
else:
for j in range(1, len(used)):
if not used[j] and x+j+1 < 2*N+1 and arr[x+j+1] == 0:
used[j] = True
arr[x] = j
arr[x+j+1] = j
dfs(x+1)
used[j] = False
arr[x] = 0
arr[x+j+1] = 0
dfs(1)
print(answer)
'개발 > 알고리즘' 카테고리의 다른 글
[백준 9934] 완전 이진 트리 (python) (0) | 2021.05.31 |
---|---|
[백준 9470] Strahler 순서 (python) (0) | 2021.05.31 |
[백준 8980] 택배 (python) (0) | 2021.05.29 |
[백준 14675] 단절점과 단절선 (python) (0) | 2021.05.28 |
[백준 9081] 단어 맞추기 (python) (0) | 2021.05.25 |
최근댓글