알고리즘||코딩테스트/백준

[백준 9663번] N-Quenn - JAVA

째로스 2023. 7. 24. 23:53

https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

풀이

사용한 알고리즘 : 백트래킹

 

풀이전략

아래 그림은 N=4인 경우, 모든 경우의 수를 탐색할 수 있도록 만들어진 상태공간트리이다.

(상태 공간 : 문제의 해답을 탐색하기 위한 탐색 공간,

 상태공간트리 : 탐색 공간을 트리 형태의 구조로 암묵적으로 해석한 트리)

(1,1)은 1번 행 1번째 열에 퀸을 둔다는 의미이다.

 

1. 위와 같은 트리를 탐색하는 중 해당 노드가 이전 노드와 비교했을 경우,

    같은 열 또는 대각선 상에 있는지 확인한다.(promising 놓을 수 있는 자리인지 유망성 체크)

   - 대각선상 겹치는지 확인하는 방법은 Math.abs(col[i]-col[k]) == i-k 인 경우 겹치는 것

2. promising한 경우 하위노드까지 탐색을 진행하고, promising하지 않은 경우엔

  하위 노드 탐색을 하지 않는다.

3. 만약 마지막 행까지 탐색이 진행되었으며, 해당 노드까지 promising하다면 count를 1 증가시킨다.

4. count 값을 출력한다.

 

제출코드

import java.util.Scanner;

public class Main {
    static int resultCount=0;

    static boolean promising(int i,int[] col){
        boolean result=true;
        for(int k=1;k<i;k++){
            if(col[i]==col[k] || Math.abs(col[i]-col[k]) == i-k){
                result=false;
            }
        }
        return result;
    }

    static void n_queens(int i, int[] col){
        int n = col.length-1;
        if(promising(i,col)){
            if(i==n) resultCount++;
            else{
                for(int j=1;j<n+1;++j){
                    col[i+1]=j;
                    n_queens(i+1,col);
                }
            }
        }
    }
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        int N=scanner.nextInt();

        int col[] = new int[N+1];
        n_queens(0,col);
        System.out.println(resultCount);
    }
}