πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.9663 N-Queen 문제 풀이 - java

πŸ“– 문제

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

N-Queen λ¬Έμ œλŠ” 크기가 N Γ— N인 체슀판 μœ„μ— ν€Έ N개λ₯Ό μ„œλ‘œ 곡격할 수 μ—†κ²Œ λ†“λŠ” λ¬Έμ œμ΄λ‹€.

N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 퀸을 λ†“λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ” 접근법

Q.9663 N-Queen λ¬Έμ œμž…λ‹ˆλ‹€.

λ°±νŠΈλž˜ν‚Ή μœ ν˜•μ˜ λŒ€ν‘œμ μΈ λ¬Έμ œμž…λ‹ˆλ‹€.

N * N 체슀판 μœ„μ— ν€Έ N개λ₯Ό μ„œλ‘œ 곡격할 수 μ—†κ²Œ λ†“λŠ” 방법을 κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

μš°μ„  ν€Έμ˜ λ°°μΉ˜κ°€ λΆˆκ°€λŠ₯ν•œ κ²½μš°λŠ” 기쑴의 ν€Έμ˜ 자리의

κ°€λ‘œμ™€ μ„Έλ‘œμ— λΆˆκ°€λŠ₯ν•˜κ³  λ˜ν•œ λŒ€κ°μ„ μ˜ μœ„μΉ˜μ—λ„ λ°°μΉ˜κ°€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

μ²˜μŒμ— 체슀판 N*N을 2차원 λ°°μ—΄λ‘œ μ„ μ–Έν•˜μ—¬

λ°±νŠΈλž˜ν‚Ήμ„ μ§„ν–‰ν•˜μ˜€μ§€λ§Œ 퀸을 λ‘˜ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€ 확인할 λ•Œ 이쀑 for 문을 μ‚¬μš©ν•˜μ—¬ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚¬μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ

2차원 λ°°μ—΄λ‘œ μ„ μ–Έν•œ μ²΄μŠ€νŒμ„

1차원 λ°°μ—΄λ‘œ μ„ μ–Έν•˜μ—¬

각 μΈλ±μŠ€μ—λŠ” row둜 board[row] λŠ” column κ°’μœΌλ‘œ λ„£μ–΄μ£Όμ–΄

λ°±νŠΈλž˜ν‚Ήμ„ 톡해 풀이가 κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ’» μ½”λ“œ

2차원 λ°°μ—΄ 풀이 (μ‹œκ°„ 초과)


public class Main_9663_1 {
    static int N, ans;

    static boolean[][] board;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        board = new boolean[N][N];
        ans = 0;
        solve(0);
        System.out.println(ans);
    }

    public static void solve(int r) {
        if (r == N) {
            ans++;
            return;
        }
        for (int c = 0; c < N; c++) {
            if (check(r, c)) {
                board[r][c] = true;
                solve(r + 1);
                board[r][c] = false;
            }
        }
    }

    public static boolean check(int r, int c) {
        if (board[r][c])
            return false;

        for (int i = 0; i < N; i++) {
            if (board[i][c])
                return false;
            for (int j = 0; j < N; j++) {
                if(Math.abs(r-i) == Math.abs(c-j) && board[i][j]){
                    return false;
                }
            }
        }
        return true;
    }
}

1차원 λ°°μ—΄ 풀이 (μ •λ‹΅)


public class Main_9663_2 {
    static int N, ans;
    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];
        ans = 0;
        solve(0);

        System.out.println(ans);
    }

    public static void solve(int row) {
        if(N==row){
            ans++;
            return;
        }
        for(int i=0; i<N; i++){
            board[row] = i;
            if(check(row)){
                solve(row+1);
            }
        }
    }

    public static boolean check(int row) {
        for(int i=0; i<row; i++){
            if(board[i] == board[row] || Math.abs(board[i]- board[row]) == Math.abs(i-row)){
                return false;
            }
        }
        return true;
    }
}

Written on March 12, 2021