๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] N-Queen - C++ ๋ณธ๋ฌธ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] N-Queen - C++

.23 2024. 11. 11. 19:39
๋ฌธ์ œ

๊ฐ€๋กœ, ์„ธ๋กœ ๊ธธ์ด๊ฐ€ n์ธ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ๋œ ์ฒด์ŠคํŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒด์ŠคํŒ ์œ„์˜ n๊ฐœ์˜ ํ€ธ์ด ์„œ๋กœ๋ฅผ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๋„๋ก ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ n์ด 4์ธ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋ฉด n๊ฐœ์˜ ํ€ธ์€ ์„œ๋กœ๋ฅผ ํ•œ๋ฒˆ์— ๊ณต๊ฒฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

์ฒด์ŠคํŒ์˜ ๊ฐ€๋กœ ์„ธ๋กœ์˜ ์„ธ๋กœ์˜ ๊ธธ์ด n์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, n๊ฐœ์˜ ํ€ธ์ด ์กฐ๊ฑด์— ๋งŒ์กฑ ํ•˜๋„๋ก ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ returnํ•˜๋Š” solutionํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ
  • ํ€ธ(Queen)์€ ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • n์€ 12์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ
n result
4 2

๊ธฐ๋ณธ ์•„์ด๋””์–ด

N-Queen์€ ์ง„์งœ ์œ ๋ช…ํ•œ ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ์ž„

 

4 X 4 ์ฒด์ŠคํŒ์—์„œ 4๊ฐœ์˜ ํ€ธ์„ ์„œ๋กœ ๊ณต๊ฒฉ ๋ฒ”์œ„๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๋‘๊ธฐ ์œ„ํ•ด

(0, 0)๋ถ€ํ„ฐ ์ฒซ๋ฒˆ์งธ ํ€ธ์„ ๋ฐฐ์น˜ํ•ด ๋‚˜๊ฐ€๋ณธ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด

 

 

๋‘๋ฒˆ์งธ ํ€ธ์„ (1, 2)์— ๋ฐฐ์น˜ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ๋‚จ๋Š” ์นธ์ธ (3, 1)์— ์„ธ๋ฒˆ์งธ ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๊ณ  ๋‚˜๋ฉด

๋งˆ์ง€๋ง‰ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

๋”ฐ๋ผ์„œ ๋‹ค์‹œ ๋‘๋ฒˆ์งธ ํ€ธ์œผ๋กœ ๋Œ์•„์™€ ๋‘๋ฒˆ์งธ ํ€ธ์„ (1, 3)์— ๋ฐฐ์น˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์„ธ๋ฒˆ์งธ ํ€ธ์„ (2, 1)์— ๋ฐฐ์น˜ํ•˜๊ณ  ๋‚˜๋ฉด ๋งˆ์ง€๋ง‰ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์—

 

 

๋‹ค์‹œ ์ฒซ๋ฒˆ์งธ ํ€ธ์œผ๋กœ ๋Œ์•„์™€ ์ฒซ๋ฒˆ์งธ ํ€ธ์„ (0, 1)์— ๋ฐฐ์น˜ํ•œ๋‹ค.

 

๋‘๋ฒˆ์งธ ํ€ธ์„ (1, 3), ์„ธ๋ฒˆ์งธ ํ€ธ์„ (2, 0), ๋งˆ์ง€๋ง‰ ํ€ธ์„ (3, 2)์— ๋ฐฐ์น˜ํ•˜๋ฉด ์ด ๋„ค ๊ฐœ์˜ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒซ๋ฒˆ์งธ ํ€ธ์„ (0, 2)์— ๋ฐฐ์น˜ํ•˜๋ฉด

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 2, 3, 4๋ฒˆ์งธ ํ€ธ์˜ ์œ„์น˜๋ฅผ ๋”ฐ๋ผ ๋ฐฐ์ •ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด ๋„ค๊ฐœ์˜ ํ€ธ์ด ๋ชจ๋‘ ๋ฐฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

์ด ๊ณผ์ •์„ DFS ๊ธฐ๋ฐ˜์˜ ๋ฐฑํŠธ๋ž˜ํ‚น์— ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. ์–ด์ฐจํ”ผ ํ€ธ์€ ํ•œ ํ–‰์— ํ•˜๋‚˜๋ฐ–์— ๋ชป ๋“ค์–ด๊ฐ„๋‹ค. (๊ณต๊ฒฉ๋ฒ”์œ„๋กœ ์ธํ•ด)

    โ†’ ๊ฐ queen๋งˆ๋‹ค (0 ~ N - 1) ๊นŒ์ง€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” column๋งŒ ํƒ์ƒ‰

 

2. ๋งŒ์•ฝ i๋ฒˆ์งธ column์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด

visited[queen][i] = true; // ํ˜„์žฌ ํƒ์ƒ‰์ค‘์ธ ํ€ธ์„ (queen, i)์— ๋‘๊ณ 
DFS(queen + 1) // ๋‹ค์Œ queen ํƒ์ƒ‰
visited[queen][i] = false;
// ์ „์ฒด ๊ฒฝ์šฐ์˜ ์ˆ˜ ํƒ์ƒ‰์„ ์œ„ํ•ด
// (queen, i)์— ๋ฐฐ์น˜ํ•ด๋‘๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด false๋กœ ๋˜๋Œ๋ ค๋†“๊ธฐ

 

์ด ๋•Œ, ๋‹ค๋ฅธ ํ€ธ๊ณผ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ๊ฐ column ๋ณ„ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

ํ€ธ์˜ ๊ณต๊ฒฉ ๋ฒ”์œ„๋Š” ๊ฐ™์€ ํ–‰ / ๊ฐ™์€ ์—ด / ์–‘ ๋Œ€๊ฐ ๋ฐฉํ–ฅ ์ธ๋ฐ, ๊ฐ row ๋ณ„๋กœ ํ•˜๋‚˜์”ฉ๋งŒ ๋ฐฐ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋™์ผ ํ–‰ ๋ฒ”์œ„๋Š” ํƒ์ƒ‰์ด ๋๋‚ฌ๊ณ ,

 

- ๊ฐ™์€ column์— queen์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

for(i = 0; i < N; i++) {
    if(i != row && visited[i][col]) return false;
}

 

- ์–‘ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

// ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ ์ฒดํฌ
int l_r_diag = row - col;
int r_l_diag = row + col;

for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
        if((i - j == l_r_diag || i + j == r_l_diag) && visited[i][j]) return false;
    }
}

์›๋ฆฌ

 

์™€ ๊ฐ™์ด ๊ณ„์‚ฐํ•ด์ฃผ์–ด ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ - 1
#include <string> 
#include <vector>

#define MAX 13

using namespace std;

bool visited[MAX][MAX] = { false };
int N, cnt = 0;

bool is_placed(int row, int col) {
    // ํ–‰ ๋ฐฉํ–ฅ ์ฒดํฌ
    for(int i = 0; i < N; i++) {
        if(i != row && visited[i][col]) return false;
    }
    
    // ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ ์ฒดํฌ
    int l_r_diag = row - col;
    int r_l_diag = row + col;

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            if((i - j == l_r_diag || i + j == r_l_diag) && visited[i][j]) return false;
        }
    }
    return true;
}

void DFS(int queen) {
    if(queen == N) {
        cnt++;
        return;
    }

    for(int i = 0; i < N; i++) {
        if(is_placed(queen, i)) {
            visited[queen][i] = true;
            DFS(queen + 1);
            visited[queen][i] = false;
        }
    }

}


int solution(int n) {
    N = n;
    DFS(0);
    return cnt;
}

 

 

๊นŒ์ง€๊ฐ€ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ’€์ด ๋ฐฉ๋ฒ•์ด๊ณ ,

๋™์ผ ์›๋ฆฌ๋ฅผ ํ™œ์šฉํ–ˆ์„ ๋•Œ ์ข€ ๋” ํšจ์œจ์ ์ธ ํ’€์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์‘์šฉ ํ’€์ด

์–ด์ฐจํ”ผ ํ€ธ์€ ํ•œ ํ–‰์— ํ•˜๋‚˜๋ฐ–์— ๋ชป ๋“ค์–ด๊ฐ„๋‹ค.
- ์•„๊นŒ ๋‚ด๊ฐ€๋งํ•จ

 

๋”ฐ๋ผ์„œ bool visited[N][N] ๋Œ€์‹ ,

int visited[queen] ์— queen๋ฒˆ์งธ ํ€ธ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” column์„ ์ €์žฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์›๋ฆฌ๋Š” ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— DFS ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ํฌ๊ฒŒ ์ˆ˜์ •ํ•ด์ค„ ๊ฒƒ์ด ์—†๊ณ ,

๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋งŒ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ™์€ ํ–‰์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ ๊ณ ๋ ค๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„˜์–ด๊ฐ€๊ณ ,

- ๊ฐ™์€ column์— queen์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

for(int i = 0; i < queen; i++)
    if(visited[queen] == visited[i]) return false;

์ด์™€ ๊ฐ™์ด ํŒ๋‹จํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋˜ํ•œ, ์–ด์ฐจํ”ผ queen์€ 0๋ถ€ํ„ฐ N๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์กด์žฌํ•˜๋Š” queen ์œ„์—๊นŒ์ง€๋งŒ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์œ„์— ๊ฑธ๋ฆฌ๋Š” queen์ด ์žˆ๋Š”์ง€๋งŒ ํŒ๋‹จํ•ด์ค€๋‹ค.

 

- ์–‘ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ

for(int i = 0; i < queen; i++) {
    if(queen - i == abs(visited[queen] - visited[i])) return false;
}

์›๋ฆฌ๋Š” ์œ„์™€ ์กฐ๊ธˆ์€ ๋‹ค๋ฅธ๋ฐ,

์ด์™€ ๊ฐ™์ด ์–‘ ๋Œ€๊ฐ ๋ฐฉํ–ฅ์— queen์ด ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

 

๋”ฐ๋ผ์„œ ์ˆ˜์ •ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์ฝ”๋“œ - 2
#include <string> 
#include <vector>

#define MAX 13

using namespace std;

int visited[MAX] = { 0 };
int N;
int answer = 0;

bool is_placed(int queen) {
    for(int i = 0; i < queen; i++) { // 0๋ถ€ํ„ฐ ํ˜„์žฌ queen ์œ„๋กœ๋งŒ ํƒ์ƒ‰ ์ง„ํ–‰
        if(visited[i] == visited[queen] || queen - i == abs(visited[queen] - visited[i])) return false;
    }
    return true;
}

void DFS(int queen) {
    if(queen == N) {
        answer++;
        return;
    }

    for(int i = 0; i < N; i++) {
        visited[queen] = i;
        if(is_placed(queen)) {
            DFS(queen + 1);
        }
    }
}

int solution(int n) {
    N = n;
    DFS(0);
    return answer;
}
Comments