Algorithm/์™„์ „ํƒ์ƒ‰(Brute-Force)

[๋ฐฑ์ค€, Java] 9663๋ฒˆ : N-Queen

Zayson 2022. 5. 16. 12:38

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

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

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ฒซ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋ชจ๋“  ๋ฐฐ์น˜์— ํ€ธ์„ ๋†“์•„๋ณด๋Š” ๋ฐฉ์‹์˜ ์™„์ „ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.

ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๊ธฐ ์ „์— ์ด์ „ ํ–‰์— ๋†“์ธ ํ€ธ ๋“ค์ด ์›€์ง์ผ ์ˆ˜ ์—†๋Š” ์œ„์น˜์— ๋†“์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ–‰ ๋งˆ๋‹ค ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋ฉด์„œ ์ด์ „ ํ–‰์˜ ํ€ธ์˜ ๋ฐฐ์น˜์™€ ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

์ด์ „ ํ–‰์˜ ํ€ธ๋“ค๊ณผ ๊ฒน์น  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. ์ด์ „ ํ–‰๋“ค์— ๋†“์ธ ํ€ธ์˜ ์—ด๊ณผ ํ˜„์žฌ ๋†“์„ ํ€ธ์˜ ์—ด์ด ๋™์ผํ•œ ๊ฒฝ์šฐ
  2. ์ด์ „ ํ–‰๋“ค์— ๋†“์ธ ํ€ธ๊ณผ ํ˜„์žฌ ๋†“์„ ํ€ธ์ด ๋Œ€๊ฐ์„ ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

๋™์ผํ•œ ํ–‰์— ํ€ธ์ด ๋†“์ด๋Š” ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•ด์•ผํ•˜์ง€๋งŒ, ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด ํ•œ ํ–‰ (depth)๋งˆ๋‹ค ํ€ธ์„ ๋ฐฐ์น˜ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ํ–‰์— ๋‘ ๊ฐœ์ด์ƒ์˜ ํ€ธ์ด ๋†“์ด๋Š” ๊ฒฝ์šฐ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๊ฐ ํ–‰ (depth)๋งˆ๋‹ค ํ€ธ์˜ ์—ด ์œ„์น˜๋ฅผ ์ €์žฅํ•  pos ๋ฐฐ์—ด์„ ์ด์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, pos[2]๋Š” 2์ธ๋ฐ ์ด๋Š” 2ํ–‰ 2์—ด์— ํ€ธ์ด ๋†“์•„์ ธ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

pos ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ์ด์ „ ํ€ธ์˜ ํ–‰๊ณผ ์—ด์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ณ , ๋งค ํ–‰๋งˆ๋‹ค ํ˜„์žฌ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ํ–‰๊ณผ ์—ด์„ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

1๋ฒˆ ์กฐ๊ฑด์„ ํŒ๋‹จํ•  ๋•Œ๋Š” pos[์ด์ „ ํ–‰]๊ณผ ํ˜„์žฌ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์—ด์„ ์ด์šฉํ•ด ํŒ๋‹จํ•œ๋‹ค.

 

2๋ฒˆ ์กฐ๊ฑด์„ ํŒ๋‹จํ•  ๋•Œ๋Š” ์ด์ „ ํ–‰๊ณผ ํ˜„์žฌ ํ–‰์˜ ์ฐจ์ด, ์ด์ „ ํ–‰๋“ค์— ๋†“์ธ ์—ด๊ณผ ํ˜„์žฌ ์—ด ์ฐจ์ด์˜ ๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ๋Š” ๋Œ€๊ฐ์„ ์— ๋†“์ธ ๊ฒฝ์šฐ์ž„์„ ์•Œ ์ˆ˜์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, |pos[์ด์ „ํ–‰] - ํ˜„์žฌ ์—ด| == |์ด์ „ ํ–‰ - ํ˜„์žฌ ์—ด| ์ธ ๊ฒฝ์šฐ ๋Œ€๊ฐ์„ ์— ์œ„์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

curRow - row == curCol - pos[row]๋Š” ๋Œ€๊ฐ์„ ์— ๋ฐฐ์น˜๋˜๋Š” ๊ฒฝ์šฐ

๐Ÿšฉ Java ์ฝ”๋“œ

package com.algorithm.Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main_9663_NQueen {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[] pos = new int[N];

        int rst = nQueen(N, pos);
        System.out.println(rst);
        br.close();
    }

    private static int count;
    private static int nQueen(int N, int[] pos) {
        count = 0;

        putQueen(0, pos, N);

        return count;
    }

    private static void putQueen(int row, int[] pos, int n) {
        // ๋ชจ๋“  ํ–‰์— ํ€ธ์„ ๋‹ค ๋ฐฐ์น˜ํ•œ ๊ฒฝ์šฐ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€
        if(row == n) {
            count++;
            return;
        }

        // 0๋ฒˆ์งธ ์—ด ๋ถ€ํ„ฐ n ๋ฒˆ์žฌ ์—ด ๊นŒ์ง€
        for(int col = 0; col < n; col++) {
            pos[row] = col; // ํ˜„์žฌ ํ–‰์˜ ํ€ธ์˜ ์—ด์œ„์น˜๋ฅผ ์ €์žฅ

            if(possible(row, col, pos)) {
                putQueen(row + 1, pos, n);
            }
        }
    }

    // ํ˜„์žฌ ์œ„์น˜์— ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จ
    private static boolean possible(int curRow, int curCol, int[] pos) {
        // ์ฒซ ๋ฒˆ์งธ ํ–‰๋ถ€ํ„ฐ ํ˜„์žฌ ํ–‰ ๊นŒ์ง€ ๋†“์ธ ํ€ธ์„ ํŒ๋‹จ
        for(int row = 0; row < curRow; row++) {
            // 1. ์ด์ „์— ๋†“์ธ ํ€ธ์˜ ์—ด๊ณผ ํ˜„์žฌ ํ€ธ์˜ ์—ด์ด ๋™์ผํ•˜๋ฉด ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ false
            if(pos[row] == curCol) return false;

            // 2. "์ด์ „ ํ–‰๊ณผ ํ˜„์žฌ ํ–‰์˜ ์ฐจ์ด"์™€ "์ด์ „ ํ–‰์˜ ์—ด๊ณผ ํ˜„์žฌ ํ–‰์˜ ์—ด์˜ ์ฐจ์ด"๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ๋Š” ๋Œ€๊ฐ์„ ์— ํ€ธ์ด ๋†“์ธ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ false
            if(Math.abs(row - curRow) == Math.abs(pos[row] - curCol)) return false;
        }
        // 3. ์ด์™ธ์˜ ๊ฒฝ์šฐ๋Š” ๊ฒน์น˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
        return true;
    }
}
๋ฐ˜์‘ํ˜•