[백준 풀이] 백준 9663 "N-Queen"
https://www.acmicpc.net/problem/9663
직접 공책에 써보면 이해가 좀 더 쉬운것 같습니다.
전체적인 흐름은 다음 그림과 같습니다.(글씨체가 너무 안좋아서 그림만 보시면 될것 같습니다)
위 그림은 N=4로 예를 들었습니다.
먼저 기본적으로 시작은 첫번째 줄의 왼쪽부터 오른쪽까지 반복하며 경우의 수를 찾습니다. 그 후 재귀호출을 통해서 두번 째줄과 세번째 줄 N번 째 줄까지 탐색하며 해결책이 없으면 다시 뒤로 백트래킹합니다.
이제 Feasible 함수에 대해 간단하게 알아보면 이 함수는 해당 위치에 퀸을 놓을 수 있는지 여부를 알려줍니다.
이 때 가로 인덱스의 값을 비교해서 같으면 가로, 세로에 퀸이 있는것이고 가로의 차와 세로의 차를 비교해서 같으면 대각선에 퀸이 이미 놓여져있는겁니다. 그리고 이 두 연산을 or 연산해서 최종적으로 true인지 false인지 구합니다.
여러가지 시행착오가 있었는데 제가 겪은 시행착오는 자꾸 모든 판을 하나씩 돌아다니면서 4*4면 16칸을 모두 돌아가면서 경우를 알아봐야한다고 생각했는데 직접 그려보면서 제일 첫째 줄만 돌아다니면서 밑에줄로 가고 해결책이 없으면 백트래킹하는 형태로 알고리즘을 짜야한다는것을 알았습니다.
다음은 제가 작성한 자바 코드입니다.
import java.util.Scanner;
import java.lang.Math;
public class Main {
static int count = 0;
static int[] already;
static boolean Feasible(int idx) {
for(int i = 0;i < idx;i++) {
if(already[idx] == already[i] || idx - i == Math.abs(already[idx] - already[i])) {
return false;
}
}
return true;
}
static void Nqueen(int N, int idx) {
if(idx == N) {
count++;
return;
}
for(int i = 0;i < N;i++) {
already[idx] = i;
if (Feasible(idx)) {
Nqueen(N, idx + 1);
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
already = new int[N];
Nqueen(N, 0);
System.out.print(count);
}
}
다음에는 스도쿠까지 풀어서 백트래킹 개념을 어느정도 정리해야겠습니다.
Author And Source
이 문제에 관하여([백준 풀이] 백준 9663 "N-Queen"), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sungwanim/백준-풀이-백준-9663-N-Queen저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)