728x90
반응형
풀이 :
DFS로 풀어야 함. board[N]을 만들어 열을 내려가면서 해당 행에 어떤 위치에 퀸을 놓았는지 명시. 재귀 호출을 통해 위쪽 열(curr = 0)부터 퀸을 놓고 아래로(curr = N) 내려가는 방식
Code
public class Solution2806V {
static int board[]; // 퀸의 위치를 담는다. (board[0]=1 -> (0,1)에 하나의 퀸이 있다. board[1] = 3 -> (1,3)에 하나의 퀸이 있다.)
static int answer;
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int tc = 1; tc <= T; tc++) {
int N = sc.nextInt();
board = new int[N];
answer = 0;
countNQueenCase(N, 0);
System.out.println("#" + tc + " " + answer);
}
}
public static void countNQueenCase(int N, int curr) {
boolean isPossible; //놓을 수 있는가
if (curr == N) { //모든 퀸을 놓은 경우
answer++;
return;
}
for (int i = 0; i < N; i++) { // [curr][i]에 퀸을 놓을 수 있는지 확인
isPossible = true;
for (int j = 0; j < curr; j++) {
if (board[j] == i || i == board[j]+(curr - j) || i == board[j]-(curr - j)) { //직선, 대각선 확인
/**
* board[j] == i : 위에서 놓은 퀸이 있는 직선이기에 이 열은 다른 퀸을 놓을 수 없다
* i == board[j]+(curr - j) : 위에서 놓은 퀸의 오른쪽 대각선이 현재 행의 i를 지나가기에 다른 퀸을 놓을 수 없다
* i == board[j]-(curr - j)) : 위에서 놓은 퀸의 왼쪽 대각선이 현재 행의 i를 지나가기에 다른 퀸을 놓을 수 없다
*/
isPossible = false;
break;
}
}
if (isPossible) {
board[curr] = i;
countNQueenCase(N, curr + 1);
}
}
}
}
Code - 다른 풀이
아래 풀이의 이해가 더 쉬울 수 있음
/**
* private static int answer;
* public static void main(String[] args) {
* Scanner scanner = new Scanner(System.in);
* int T = scanner.nextInt(); // 테스트케이스 개수 T
*
* for (int i = 1; i <= T; i++) {
* int N = scanner.nextInt(); // 퀸 N개 (1~10)
* int[] row = new int[N];
* answer = 0;
*
* dfs(0, row, N);
*
* System.out.println("#"+ i + " " + answer);
* }
* }
*
* private static void dfs(int level, int[] row, int N) {
* if (level == N) {
* answer++;
* return;
* }
* for (int i = 0; i < N; i++) {
* row[level] = i;
*
* if (isPromising(level, row)){
* dfs(level + 1, row, N);
* }
* }
* }
*
* private static boolean isPromising(int next, int[] row) {
* for (int i = 0; i < next; i++) { // 새로 놓는 퀸 이전까지 놨던 퀸들의 위치랑 비교
* if (row[i] == row[next] || Math.abs(row[i]-row[next]) == next - i) return false;
* }
* return true;
* }
*/
728x90
반응형
'SWEA' 카테고리의 다른 글
swea 2817 [D3] 부분 수열의 합 JAVA (0) | 2023.11.29 |
---|---|
swea 2814 [D3] 최장 경로 JAVA (0) | 2023.11.29 |
swea 2805 [D3] 농작물 수확하기 JAVA (1) | 2023.11.29 |
swea 1873 [D3] 상호의 배틀필드 JAVA (2) | 2023.11.24 |
swea 1860 [D3] 진기의 최고급 붕어빵 JAVA (2) | 2023.11.24 |