728x90
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
1. 문제 설명
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
예제 입력 1 복사
8
예제 출력 1 복사
92
2. 문제 풀이
파이썬으로 전에 풀었던 방식을 자바로 구현했다.
N x N 의 체스판위에 퀸 N개가 서로 공격할 수 없게 놓는 자리 수는 1차원 배열로 나타낼수 있다.
arr[N]의 배열에 0~N-1 까지 하나씩 퀸을 놓아야 서로 공격할 수 없는 자리이기 때문에 for 문을 돌려서 자리마다 하나씩 찾고 체크는 그전까지 포문을 돌리고 대각선, 사방으로 체크 해본다.
3. 코드
import java.util.Arrays;
import java.util.Scanner;
import static java.lang.Math.abs;
public class Main {
static int n;
static int cnt = 0;
static int arr[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
arr = new int[n];
Arrays.fill(arr, 0);
n_queen(0);
System.out.println(cnt);
}
public static boolean location(int d) {
for (int i = 0; i < d; i++) {
if (arr[d] == arr[i] || abs(arr[d] - arr[i]) == abs(d - i)){
return false;
}
}
return true;
}
public static void n_queen(int k){
if (k == n) {
cnt += 1;
} else {
for (int i = 0; i < n; i++) {
arr[k] = i;
if (location(k)) {
n_queen(k+1);
}
}
}
}
}
728x90
'Programming > Java' 카테고리의 다른 글
백준 15686 : 치킨 배달 [JAVA] (0) | 2023.04.03 |
---|---|
백준 16236 : 아기 상어 [JAVA] (0) | 2023.04.03 |
백준 1753 : 최단 거리 [JAVA] (0) | 2023.03.28 |
객체 지향 설계 원칙 (1) | 2023.03.06 |
Java - 기본 개념 (0) | 2023.02.20 |