N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
Solution
너무 유명한 알고리즘이라 퀸이 어떻게 움직이는 지도 써져있지 않다..(^^) 퀸은 상하좌우대각선 8방향으로 움직인다.
2차원 배열을 이용해도 되지만, index를 열, arr[index]를 행으로 하는 1차원 배열로 푸는게 더 간단하다.
위의 경우 arr = { 6, 4, 2, 0, 5, 7, 1, 3} 으로 표기할 수 있다.
import java.util.*;
import java.io.*;
class Solution
{
static int N;
static int cnt=0;
static int[] arr;
public static boolean check(int L) {
// 같은 행에 퀸이 있는 지 확인, 대각선에 퀸이 있는 지(행의 차와 열의 차가 같은 지) 확인
// 확인은 L열 전까지 해야함 (본인을 탐색할 경우 무조건 false)
for(int i=0;i<L;i++) {
if(arr[i]==arr[L]) return false;
if(Math.abs(i-L)==Math.abs(arr[i]-arr[L])) return false;
}
return true;
}
public static void dfs(int L) {
if(L==N) {
cnt++;
}else {
for(int i=0;i<N;i++) {
arr[L]=i;
if(check(L)) {
dfs(L+1);
}
}
}
}
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N=Integer.parseInt(br.readLine());
arr=new int[N];
dfs(0);
System.out.print(cnt);
}
}
dfs 함수 자체는 중복 순열의 형태와 같다.
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[백준] 1080 : 행렬 (JAVA) (0) | 2022.07.28 |
---|---|
[백준] 1149 : RGB거리 (JAVA) (0) | 2022.07.28 |
[백준] 3273 : 두 수의 합 (JAVA) (0) | 2022.07.28 |
[백준] 11053 : 가장 긴 증가하는 부분 수열 / LIS (JAVA) (0) | 2022.07.28 |
[백준] 1912 : 연속합 (JAVA) (0) | 2022.07.28 |
댓글