코딩테스트 파이썬/파이썬 프로그래머스 2단계
N-Queen
세용용용용
2024. 7. 15. 09:40


코딩테스트 연습 - N-Queen | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
# 2024-07-14
import copy
def ch_board(board, row, col, n):
for i in range(row+1, n):
board[i][col]=1
if 0<=col-(i-row)<n:
board[i][col-(i-row)]=1
if 0<=col+(i-row)<n:
board[i][col+(i-row)]=1
return board
def dfs(board, row, n):
answer=0
if row==n:
return 1
for i in range(n):
if board[row][i]==0:
cp_board=[row[:] for row in board]
answer+=dfs(ch_board(cp_board, row, i, n), row+1, n)
return answer
def solution(n):
board = [[0]*n for _ in range(n)]
answer = dfs(board, 0, n)
return answer
시간 복잡도
각 행에서 최대 n개의 열을 시도하고, 각 시도마다 dfs를 재귀 호출
시간 복잡도는 O(n!)
수정 코드(시간 단축, 리팩토링)
def dfs(n, now_row, d_set, ld_set, rd_set):
answer = 0
if now_row == n:
return 1
else:
for now_col in range(n):
if (now_col in d_set) or (now_row-now_col in ld_set) or (now_row+now_col in rd_set):
continue
d_set.add(now_col)
ld_set.add(now_row-now_col)
rd_set.add(now_row+now_col)
answer+=dfs(n, now_row+1, d_set, ld_set, rd_set)
d_set.remove(now_col)
ld_set.remove(now_row-now_col)
rd_set.remove(now_row+now_col)
return answer
def solution(n):
answer=dfs(n, 0, set(), set(), set())
return answer
세로, 대각선 관련 집합을 통해 생성 불가능한 큐의 위치는 가지치기!!!!
