가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다.
예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은 서로를 한번에 공격 할 수 없습니다.
체스판의 가로 세로의 세로의 길이 n이 매개변수로 주어질 때, n개의 퀸이 조건에 만족 하도록 배치할 수 있는 방법의 수를 return하는 solution함수를 완성해주세요.
제한사항
나의 문제해결방식은 아래와 같다.
class Solution {
static int answer = 0;
// 대각선 왼쪽 검사
static boolean diagonalLeft(int l, int i, int[][]board) {
int x = l - 1, y = i - 1;
while(x >= 0) {
if (y < 0) break;
if (board[x--][y--] == 1) return false;
}
return true;
}
// 대각선 오른쪽 검사
static boolean diagonalRight (int l, int i, int[][] board) {
int x = l - 1, y = i + 1;
while (x >= 0) {
if (y >= board.length) break;
if (board[x--][y++] == 1) return false;
}
return true;
}
// 위쪽 검사
static boolean up (int l, int i, int[][] board) {
int x = l - 1, y = i;
while (x >= 0) {
if (board[x--][y] == 1) return false;
}
return true;
}
static void dfs(int l, int[][] board) {
if (l == board.length) answer++;
else {
for (int i = 0; i < board.length; i++) {
if ((l == 0) || diagonalLeft(l, i, board) && diagonalRight(l, i, board) && up(l, i, board)) {
board[l][i] = 1;
dfs(l+1, board);
board[l][i] = 0;
}
}
}
}
public int solution(int n) {
int[][] board = new int[n][n];
dfs(0, board);
return answer;
}
}
이렇게 풀어도 되지만 일차원 배열을 활용하여 더욱 간단하게 해결할수도 있다.
다음은 일차원 배열만으로도 해결할 수 있는 방법이다.
일차원 배열의 index가 column에 해당하고, index안의 값이 row에 해당한다.
예를들어 board = {1, 2, 3, 4}라면 1은 board[0][1]에 q가 있다는 뜻이다.
그 다음은 이차원배열과 비슷하다.
board[row]의 값을 바꿔보면서 조건에 통과되면 dfs의 다음층으로 넘어가고, 그렇지 않으면 다음층으로 가지 않으면된다.
check
즉 위의 두 조건을 만족하면 true를 반환한다.
import java.util.*;
class Solution {
static int[] board;
static int answer = 0;
public int solution(int n) {
board = new int[n];
dfs(0);
return answer;
}
static void dfs (int row) {
if (row == board.length) answer++;
else {
for (int i = 0; i < board.length; i++) {
board[row] = i;
if (check(row)) dfs(row+1);
}
}
}
static boolean check (int row) {
for (int i = 0; i < row; i++) {
if (board[i] == board[row]) return false;
if (Math.abs(i - row) == Math.abs(board[i] - board[row])) return false;
}
return true;
}
}