문제
- 링크
title: "코딩테스트 연습 - N-Queen" image: "https://image.freepik.com/free-vector/landing-page-template-for-a-website_23-2147782747.jpg" description: "가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다." url: "https://arc.net/l/quote/krooqkxt"
문제 풀이
문제 접근
- 백트래킹을 사용하여, 퀸을 놓을 수 있는 자리에 놓아간다.
간단한 수도 코드 정리
```pseudocode 함수 solution(n): 열과 대각선을 체크할 배열 초기화 백트래킹 함수 호출 (첫 번째 행부터 시작) 가능한 배치 개수 반환
함수 backtrack(현재 행, n): 만약 모든 행에 퀸을 배치했다면: 배치 개수 증가 반환
각 열을 순회하며:
만약 현재 열 또는 대각선이 사용 중이라면:
건너뛰기
퀸을 현재 위치에 배치
다음 행으로 이동 (재귀 호출)
퀸을 제거 (백트래킹)
---
## 풀이 코드
```java
class Solution {
private int count = 0; // 가능한 배치 개수
private boolean[] col; // 열 체크
private boolean[] diag1; // \ 방향 대각선 체크
private boolean[] diag2; // / 방향 대각선 체크
public int solution(int n) {
col = new boolean[n];
diag1 = new boolean[2 * n - 1];
diag2 = new boolean[2 * n - 1];
backtrack(0, n); // 첫 번째 행부터 배치 시작
return count;
}
private void backtrack(int row, int n) {
if (row == n) { // 모든 행을 채웠다면 경우의 수 증가
count++;
return;
}
for (int c = 0; c < n; c++) { // 각 열을 순회하며 퀸 배치 가능 여부 확인
if (col[c] || diag1[row + c] || diag2[row - c + (n - 1)]) {
continue; // 현재 열 또는 대각선이 이미 사용 중이면 건너뛰기
}
// 퀸 배치
col[c] = diag1[row + c] = diag2[row - c + (n - 1)] = true;
// 다음 행으로 이동
backtrack(row + 1, n);
// 퀸 제거 (백트래킹)
col[c] = diag1[row + c] = diag2[row - c + (n - 1)] = false;
}
}
}