์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- skala
- ์ฐ์ ์์ํ
- ์ ๋ ฌ
- ๋ณํฉ์ ๋ ฌ
- ๋์ ํฉ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ค๋ธ์
- ๊ทธ๋ํํ์
- ๋ฐฑ์ค
- ๊ตฌํ
- ๋จธ์ง์ํธ
- ํ์ด์ฌ
- LIS
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- BFS
- ๋์ ๊ณํ๋ฒ
- ์ํ
- ๊ทธ๋ํ
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- SQL
- ์๊ณ ๋ฆฌ์ฆ
- db
- ๊ทธ๋ฆฌ๋
- ์์ํ์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- DP
- ๊น์ด์ฐ์ ํ์
- ๋๋น์ฐ์ ํ์
- skala1๊ธฐ
- DFS
- Today
- Total
๐๐ญ๐ฐ๐ธ ๐ฃ๐ถ๐ต ๐ด๐ต๐ฆ๐ข๐ฅ๐บ
[ํ๋ก๊ทธ๋๋จธ์ค] 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;
}
'์ฝ๋ฉํ ์คํธ ์ค๋น > ํ๋ก๊ทธ๋๋จธ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ํ๋ฐฐ ๋ฐฐ๋ฌ๊ณผ ์๊ฑฐํ๊ธฐ - ํ์ด์ฌ (1) | 2024.11.14 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ถ๋ ์ฌ์ฉ์ - C++ (0) | 2024.11.12 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฌํ๊ฒฝ๋ก - C++ (0) | 2024.11.08 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋จ์์นด๋ฉ๋ผ - C++ (0) | 2024.04.11 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ ๋งต๊ฒ - C++ (0) | 2024.04.11 |