2 ๋ถ„ ์†Œ์š”

N-Queen ๋ฌธ์ œ

N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N ร— N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค.
N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ€ธ์„ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋ฐฑํŠธ๋ž˜ํ‚น

์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋‹ค.
๋ฐฑํŠธ๋ฆฌํ‚น์ด๋ž€ โ€œ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ํƒ์ƒ‰ํ•œ๋‹คโ€์˜ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง„๋‹ค.
์ฆ‰, ๋ฐฑํŠธ๋ž˜ํ‚น์€ ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ›„๋ณด๊ตฐ์„ ๋”ฐ๋ผ ๋“ค์–ด๊ฐ€๋ฉฐ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ํ›„๋ณด๋ฅผ ๊ตฌ์ถ•ํ•ด ๋‚˜์•„๊ฐ€๋‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๊ฐ€ ํŒ๋‹จ๋˜๋ฉด ์ฆ‰์‹œ ํ›„๋ณด๋ฅผ ํฌ๊ธฐํ•˜๋ฉด์„œ ์ •๋‹ต์„ ์ฐพ์•„๊ฐ€๋Š” ๋ฒ”์šฉ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
**โ€œํŠน์ •์กฐ๊ฑดโ€์„ ๋งŒ์กฑํ•˜๋Š” โ€œ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜โ€๋ฅผ ์ฐพ์„ ๋•Œ ์šฉ์ดํ•จ!**

๋ฐฑํŠธ๋ž˜ํ‚น์˜ ๊ฐ€์ง€์น˜๊ธฐ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด, ๋ถˆํ•„์š”ํ•œ ์žฌ๊ท€ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„ ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ์—๋„ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ƒ๊ฐํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, 1์ฐจ์› ๋ฐฐ์—ด๋กœ ํ•ด๊ฒฐํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„์ด ๋” ์ ˆ์•ฝ๋œ๋‹ค.
แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-02-13 แ„‹แ…ฉแ„’แ…ฎ 10 04 54

(0,2), (1,0), (2,3), (3,1) ์ฒ˜๋Ÿผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ (2,0,3,1)์ฒ˜๋Ÿผ ํ€ธ์ด ๋†“์ธ ์—ด(row)์˜ ์œ„์น˜๋งŒ ์ €์žฅํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.
์ด์œ ๋Š” ํ€ธ์˜ ์—ด์ด ๊ฐ™๋‹ค๋ฉด ๋‹ค๋ฅธ ํ€ธ์ด ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ!

๋ฐฑํŠธ๋ž˜ํ‚น ์ ˆ์ฐจ

DFS ์ˆ˜ํ–‰ - ์œ ๋งํ•œ ๋…ธ๋“œ ๊ฒ€ํ†  - ์„œ๋ธŒ ํŠธ๋ฆฌ ์ด๋™ - ๋ฐฑํŠธ๋ž˜ํ‚น ์ˆ˜ํ–‰

  1. DFS ์ˆ˜ํ–‰
    ์›๋ž˜๋Œ€๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด์„œ ๊ณ„์† ์ด๋™ํ•˜๋Š” DFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. ์œ ๋งํ•œ ๋…ธ๋“œ ๊ฒ€ํ† 
    ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•ด์„œ ์œ ๋งํ•œ ๋…ธ๋“œ์ด๋ฉด ์„œ๋ธŒํŠธ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  3. ์„œ๋ธŒ ํŠธ๋ฆฌ ์ด๋™
    ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์‹œ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด DFS๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  4. ๋ฐฑํŠธ๋ž˜ํ‚น ์ˆ˜ํ–‰
    ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€์น˜๊ธฐํ•˜๊ณ  ์ƒ์œ„ ๋…ธ๋“œ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น ํ•œ ํ›„ DFS๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

N-Queen ๋ฐฑํŠธ๋ž˜ํ‚น ์ด์šฉํ•ด์„œ ํ’€๊ธฐ

์ฒด์Šค์—์„œ ํ€ธ์€ ์ง์„ ๊ณผ ๋Œ€๊ฐ์„  ๋ชจ๋“  ๋ฐฉํ–ฅ์œผ๋กœ ๋ชจ๋“  ์นธ์„ ์ž์œ ์ž์ œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํ€ธ๋ผ๋ฆฌ ๋†“๋Š”๋ฐ, ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜๋ ค๋ฉด ์ฒด์ŠคํŒ์˜ ํ•œ ์ค„์—๋Š” ํ•˜๋‚˜์˜ ํ€ธ๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค!

๊ทธ๋Ÿฌ๋ฉด, 1๋ฒˆ์งธ ์ค„์— ํ€ธ ํ•˜๋‚˜๋ฅผ ๋†“๊ณ  ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ€ โ€œ์กฐ๊ฑด์— ๋งž๊ฒŒโ€ ํ€ธ์„ ๋‹ค์‹œ ๋†“๊ณ , ๋‹ค์‹œ ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ€ โ€œ์กฐ๊ฑด์— ๋งž๊ฒŒโ€ ํ€ธ์„ ๋˜ ๋†“๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

[Java]์ฝ”๋“œ

package Baekjoon_sds.์•Œ๊ณ ๋ฆฌ์ฆ˜_๊ธฐ์ดˆ;
import java.util.Scanner;

// N-Queen
// 1. ํ€ธ๊ณผ ์ธ์ ‘ํ•œ ์นธ์—๋Š” ๋‹ค๋ฅธ ํ€ธ์ด ์žˆ์œผ๋ฉด ์•ˆ๋จ -> ๊ฒ€์‚ฌ ํ•„์š”
// 2. ์•ˆ์ „ํ•œ ๊ณณ์— ํ€ธ ๋ฐฐ์น˜

public class N_Queen {
    public static void main(String[] args) {
        int N;
        int[] cols;
        Scanner scanner = new Scanner(System.in);
        System.out.print("");
        N = scanner.nextInt();
        cols = new int[N];

        Queen queen = new Queen(N, cols);
        for (int i = 0; i < N; i++) {
            queen.back_tracking(i);
        }
    }
}

class Queen {
    int N;
    int cols[];

    public Queen(int n, int[] cols) {
        N = n;
        this.cols = cols;
    }

    public void back_tracking(int level) {

        if (level == N) {
            for (int i = 0; i < N; i++) {
                System.out.print(cols[i]);
            }
            System.out.println();
        } else {
            for (int i = 0; i < N; i++) {
                cols[level]=i;
                if (isPossible(level)) {
                    back_tracking(level+1);
                }
            }
        }
    }

    public boolean isPossible(int level) {
        for (int i = 0; i < level; i++) {
            if (cols[i] == cols[level] || Math.abs(level - i) == Math.abs(cols[level] - cols[i])) {
                return false;
            }
        }
        return true;
    }
}

[Python]์ฝ”๋“œ

def adjacent(x): # x์™€ i ๊ฐ€ ๊ฐ™์œผ๋ฉด ํ–‰์ด ๊ฐ™์€๊ฑฐ ๊ทผ๋ฐ for๋ฌธ์„ ๋ณด๋ฉด x์™€ i๊ฐ€ ๊ฐ™์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.
    for i in range(x): #์ธ๋ฑ์Šค๊ฐ€ ํ–‰  row[n]๊ฐ’์ด ์—ด
        if row[x] == row[i] or abs(row[x] - row[i]) == x - i: # ์—ด์ด ๊ฐ™๊ฑฐ๋‚˜ ๋Œ€๊ฐ์„ ์ด ๊ฐ™์œผ๋ฉด false
            return False # ๋Œ€๊ฐ์„ ์ด ๊ฐ™์€๊ฒฝ์šฐ๋Š” ๋‘ ์ขŒํ‘œ์—์„œ ํ–‰ - ํ–‰ = ์—ด - ์—ด ์ด ๊ฐ™์œผ๋ฉด ๋‘๊ฐœ๋Š” ๊ฐ™์€ ๋Œ€๊ฐ์„ ์ƒ์— ์žˆ๋‹ค.
    return True
 
#ํ•œ์ค„์”ฉ ์žฌ๊ท€ํ•˜๋ฉฐ dfs ์‹คํ–‰
 
def dfs(x):
    global result
 
    if x == N:
        result += 1
    else:
        # ๊ฐ ํ–‰์— ํ€ธ ๋†“๊ธฐ
        for i in range(N): # i ๋Š” ์—ด๋ฒˆํ˜ธ 0๋ถ€ํ„ฐ N ์ „๊นŒ์ง€ ์˜ฎ๊ฒจ๊ฐ€๋ฉด์„œ ์œ ๋งํ•œ๊ณณ ์ฐพ๊ธฐ
            row[x] = i
            if adjacent(x): # ํ–‰,์—ด,๋Œ€๊ฐ์„  ์ฒดํฌํ•จ์ˆ˜ true์ด๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น ์•ˆํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰
                dfs(x + 1)
 
# N = int(input())/
N = int(input())
row = [0] * N
result = 0
print(row)
dfs(0)
# print(row)
print(result)

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ