백준 알고리즘/Java

[백준] 9663.N-Queen - Java

리버🐦‍🔥 2025. 4. 21. 15:28

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

 

 

⭐️ 중요 포인트

1. |y1 - y2| / |x1 - x2| = ±1 이면 동일한 대각선 위에 위치한다라는 점을 이용

(단, 여기서 나눗셈 연산을 하게 되면 부동소수점 또는 zero division 에러가 날 수 있기 때문에 이항해서

|y1 - y2| = |x1 - x2| 조건이 만족하면 동일한 대각선 위에 존재한다고 구현)

import java.util.*;
import java.io.*;

public class P9663 {

    static BufferedReader br;
    static BufferedWriter bw;
    static StringTokenizer st;

    static int N;
    static int answer;
    static int[] board; // board의 index가 y, value가 x

    static void init() throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));

        N = Integer.parseInt(br.readLine());
        board = new int[N];
        answer = 0;
    }

    static boolean isPossible(int x, int y) {
        for (int i = 0; i < y; i++) {
            if (board[i] == x || Math.abs((y - i)) == Math.abs(x - board[i])) {
                return false;
            }
        }
        return true;
    }

    static void recursion(int y) {

        if (y == N) {
            answer++;
            return;
        }


        for (int x = 0; x < N; x++) {
            if (isPossible(x, y)) {
                board[y] = x;
                recursion(y + 1);
            }
        }



    }


    public static void main(String[] args) throws IOException {
        init();

        recursion(0);

        bw.write(String.valueOf(answer));

        bw.flush();
        bw.close();
        br.close();

    }
}