알고리즘

[BOJ-9663] N-Queen - JAVA 풀이

sppl24 2024. 12. 9. 16:03
반응형

N-Queen

문제

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)


예제 입력

8

예제 출력

92

아이디어

  • 대표적인 백트래킹 문제다 휘발되기 전에 정리해보자..
  • 대각선에 놓을 수 없고 매 행마다 열, 대각선에 놓일수 없는지를 체크해야한다
  • 어떤 영상인지는 정확히 기억은 안나지만 백트래킹을 이해하기 좋은 비유가 있었는데 도미노를 하나씩 놓고 마지막에 놓은 도미노를 넘어뜨리는걸 연상하라는 내용이었다 확실히 이미지로 기억하면 도움이 되는거 같다

JAVA 풀이

import java.io.*;

public class Main {

    static int N;
    static int cnt;
    static int[] board;

    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];

        recur(0);
        br.close();
        System.out.println(cnt);
    }

    static void recur(int queen) {

        // 갯수 확인
        if (queen == N) {
            cnt++;
            return;
        }

        for (int i = 0; i < N; i++) {
            board[queen] = i;
            if (check(queen)) {
                recur(queen + 1);
            }
        }

    }

    static boolean check(int col) {

        for (int i = 0; i < col; i++) {
            if (board[col] == board[i]) {
                return false;
            } else if (Math.abs(col - i) == Math.abs(board[col] - board[i])) {
                return false;
            }
        }
        return true;
    }
}
반응형