알고리즘/프로그래머스
[프로그래머스] N-Queen -자바(JAVA)
Junuuu
2022. 7. 12. 00:01
반응형
https://programmers.co.kr/learn/courses/30/lessons/12952
코딩테스트 연습 - N-Queen
가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은
programmers.co.kr
문제 해석
백트레킹에서 유명한 N-Queen 문제입니다.
가로, 세로 길이가 n인 정사각형 체스판이 존재합니다.
체스판 위에 n개의 퀸이 서로 공격할 수 없도록 배치하고 싶습니다.
만약 n = 4인 경우 다음과 같이 퀸을 배치하면 퀸은 서로를 한 번에 공격할 수 없습니다.
n이 매개변수로 주어질 때 n개의 퀸이 조건에 만족하도록 배치합니다.
n개의 퀸이 조건에 만족 하도록 배치할 수 있는 방법의 수를 return 하세요
퀸은 가로, 세로, 대각선으로 이동할 수 있습니다.
코드
class Solution {
static int answer = 0;
static int n;
public int solution(int n) {
this.n = n;
int[][] chessBoard = new int[n][n];
findAnswer(0, chessBoard);
return answer;
}
private static void findAnswer(int cnt, int[][] chessBoard) {
if (cnt == n) {
answer++;
return;
}
for (int i = 0; i < n; i++) {
if (canPutQueen(cnt, i, chessBoard)) {
chessBoard[cnt][i] = 1;
findAnswer(cnt + 1, chessBoard);
chessBoard[cnt][i] = 0;
}
}
}
private static boolean canPutQueen(int y, int x, int[][] chessBoard) {
int[] dy = {-1, -1, 1, 1, -1, 1, 0, 0};
int[] dx = {-1, 1, -1, 1, 0, 0, -1, 1};
//대각선 검사 + 가로세로 검사
//0~3현재 좌표에서 왼쪽위 오른쪽위 왼쪽아래 오른쪽아래 순서대로 검사함
//4~7 현재 좌표에서 상 하 좌 우 순서대로 검사함
for (int k = 0; k < 8; k++) {
int ny = y;
int nx = x;
while (true) {
ny += dy[k];
nx += dx[k];
if (!isPosValid(ny, nx)) {
break;
}
if (chessBoard[ny][nx] == 1) {
return false;
}
}
}
return true;
}
private static boolean isPosValid(int ny, int nx) {
return ny >= 0 && ny < n && nx >= 0 && nx < n;
}
}