반응형
# Problem
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. 입력첫째 줄에 N이 주어진다. (1 ≤ N < 15) 출력첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다. |
# Solution 1
def check(x): # 상하좌우, 대각선 확인
for i in range(x):
if row[x]==row[i]:
return False
if abs(row[x]-row[i])==x-i:
return False
return True
def dfs(x):
global result
if x==n:
result+=1
else:
for i in range(n):
row[x]=i
if check(x): # 해당 행에 놓아도 괜찮은 경우 다음행으로 넘어가기
dfs(x+1)
n = int(input())
row = [0]*n
result=0
dfs(0)
print(result)
# Solution 2 - 시간 초과
def available(candidate,current_col):
current_row = len(candidate)
for queen_row in range(current_row):
if candidate[queen_row] == current_col or abs(candidate[queen_row]-current_col)==current_row - queen_row:
return False
return True
def dfs(N, current_row, current_candidate, final_result):
if current_row == N:
final_result.append(current_candidate[:])
return
for candidate_col in range(N):
if available(current_candidate, candidate_col):
current_candidate.append(candidate_col)
dfs(N,current_row+1,current_candidate,final_result)
current_candidate.pop()
n = int(input())
final_result=[]
dfs(n,0,[],final_result)
print(len(final_result))
반응형
'Algorithm > 백준 알고리즘 풀이' 카테고리의 다른 글
[Baekjoon] 1759.암호 만들기 (0) | 2021.04.29 |
---|---|
[Baekjoon] 1987. 알파벳 (0) | 2021.04.29 |
[Baekjoon] 1781. 컵라면 (0) | 2021.04.28 |
[Baekjoon] 1461. 도서관 (0) | 2021.04.28 |
[Baekjoon] 2212. 센서 (0) | 2021.04.28 |