코딩테스트/프로그래머스
[프로그래머스] Level 2 - N-Queen (Python)
ye0nn
2022. 6. 30. 23:52
https://programmers.co.kr/learn/courses/30/lessons/12952
코딩테스트 연습 - N-Queen
가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은
programmers.co.kr
✅ Solution
- 첫 번째 열부터 차례대로 퀸을 추가한다.
- 퀸을 추가하고, 이전에 놓였던 퀸들과 행이 같지 않아야 하며 대각선에 위치하지 않아야 하는 조건을 체크한다.
- 열마다 하나씩 퀸을 추가할 것이므로 열이 같은 경우는 존재하지 않으므로 열에 대한 고려는 해주지 않아도 된다. (항상 하나의 열에 퀸 하나만 존재)
- new_queen_col == prev_queen_col 또는 abs(new_queen_col - prev_queen_col) == new_queen_row - prev_queen_row 일 경우 해당 위치에 퀸을 추가할 수 없으므로 종료시킨다.
- 대각선에 위치한다는 것은 기울기가 같다는 것을 의미한다. 따라서 기울기로 비교해주면 된다.
✅ Code
def nqueen(queens, next_queen, n):
global answer
if next_queen in queens: # 같은 행에 있는지 체크
return
for row, col in enumerate(queens):
next_queen_row = len(queens)
if abs(next_queen - col) == next_queen_row - row: # 대각선에 있는지 체크
return
queens.append(next_queen)
if len(queens) == n:
answer += 1
return
for next_queen in range(n):
nqueen(queens[:], next_queen, n)
def solution(n):
global answer
answer = 0
for next_queen in range(n):
queens = []
nqueen(queens, next_queen, n)
return answer