9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
제한시간 10초
- N X N 크기의 이차원 배열 체스판 board 사용
- N 개의 퀸이 주어졌을 때, 서로 공격할 수 없게 놓는 경우의 수 구하기
- 서로 공격할 수 있는지 없는지 확인하는 check 메서드
- 현재까지 놓은 퀸의 개수를 저장하는 queen
- 퀸을 놓는 방법의 수 count
- (i = 0 ~ N-1)(j = 0 ~ N-1) 상의 좌표 돌아다니며 DFS
- 도중 queen == N 이 되면 count++, 백트래킹
=> 시간초과로 다시 고민
- NxN 체스판에 N개의 퀸
-> 모든 행을 한 번씩 사용하게 됨
-> boolean[] board = new boolean[N]; 을 활용
-> board[x] = y; 가 의미하는 것
= x행 y열에 퀸을 배치한다
각 인덱스마다 0~N-1 의 값을 넣되,
열/행/대각선 위치가 아니면 count++
여기서 queen 은 배치한 퀸의 개수이자
queen 번째 퀸이 위치하는 행을 의미한다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N;
static int count = 0;
static int[] board;
static boolean check(int queen){
for(int i=0; i<queen; i++){
if(board[i] == board[queen]){
return false;
}
if(Math.abs(i - queen) == Math.abs(board[i] - board[queen])){
return false;
}
}
return true;
}
static void DFS(int queen){
if(queen == N){
count++;
return;
}
for(int i=0 ; i<N; i++){
board[queen] = i;
if(check(queen)){
DFS(queen + 1);
}
else{
board[queen] = -1;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
board = new int[N];
Arrays.fill(board, -1);
DFS(0);
System.out.println(count);
}
}
'[Solved] > BOJ' 카테고리의 다른 글
[백준 17136] 외판원 순회 (0) | 2023.05.07 |
---|---|
[백준 16987] 계란으로 계란치기 (0) | 2023.05.06 |
[백준 17136] 색종이 붙이기 (0) | 2023.05.05 |
[백준 11053] 가장 긴 증가하는 부분수열 (0) | 2023.05.03 |
[백준 1912] 연속합 (0) | 2023.05.02 |