
๋ ์ง : 2021 ๋ 11 ์ 8 ์ผ
์์ฒญ ๊ฐ์ : ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ์ดํด (1)
๋ฒ์จ 8์ผ์ฐจ๋ผ๋..์ ๊ธฐํ๋ค..
์ค๋์ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ์ดํด (1)์ ๋ค์๋ค. ํฌ์คํ ์์ฑ ํ, N ํธ์ ์ง์ ๊ตฌํํด๋ณด๊ณ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ์ดํด (2)๋ฅผ ๋ฃ๋๊ฒ ๋์ ๊ฒ ๊ฐ๋ค.
์ ๋์จ์ด..
๋ฐฑํธ๋ํน
์ ์ฝ ์กฐ๊ฑด ๋ง์กฑ ๋ฌธ์ ์์ ํด๋ฅผ ์ฐพ๊ธฐ ์ํ ์ ๋ต
ํด๊ฐ ๋ ์ ์๋ ๋ค์ํ ํ๋ณด๊ทผ์ ํธ๋ฆฌ ํํ๋ก ํํ (State Space Tree)
์ง์ง ํธ๋ฆฌ๋ ์๋๊ณ , dfs ๋ก ํ ์ ์๋ค.
How it works...
1. ๋ฃจํธ ๋ ธ๋๋ฅผ ํ๋ ์ก์์, ํด๊ฐ ๋ ์ ์๋์ง ํ๋จ
2. ํด๊ฐ ๋ ์ ์๋ค๋ฉด ํด๋น ํด์ child ๊ฐ ํด๊ฐ ๋ ์ ์๋์ง ํ๋จ
3. ํด๊ฐ ๋ ์ ์๋ค๋ฉด, ๋ค์ ๊ทธ ์ ์กฐ๊ฑด์ผ๋ก ๋์๊ฐ๋ค.
์ด๋, ํด๊ฐ ๋ ์ ์๋ ๋ ธ๋์ ์์๋ค์ ํ์ธํด๋ณด์ง ์์๋ ํด๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ง๋ค์ ํ์ธํ ํ์๊ฐ ์์ด์ง๋๋ฐ ์ด๋ฅผ ๊ฐ์ง์น๊ธฐ๋ผ๊ณ ํ๋ค.
4. ์ ๊ณผ์ ์ ์ต์ข ํด๋ฅผ ์ฐพ์ ๋ ๊น์ง ๋ฐ๋ณต

๋ํ ๋ฌธ์ : N Queen

N-Queen ๋ฌธ์ ๋ ๋ฐฑ ํธ๋ํน ์ ๋ต์ ๋ํ์ ์ธ ์์ ๋ฌธ์ ์ด๋ค.
NxN ์ฒด์คํ์ N ๊ฐ์ ํธ์ ๋์์ ๋ ์๋ก ๊ณต๊ฒฉํ์ง ๋ชปํ๋๋ก ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
์ ์ฝ ์กฐ๊ฑด : ํธ์ ๋๊ฐ์ , ์ํ, ์์ง์ผ๋ก ์ด๋ํ ์ ์๋ค.
Approach :
๋ฐฑ ํธ๋ํน์ผ๋ก ํด๋น ์ ์ฝ ์กฐ๊ฑด๋ค์ ๊ฐ์ง์น๊ธฐ ํ๋ฉด์ ์ ๊ทผํ๋ค.
์ํ์ผ๋ก ์ด๋ ํ ์ ์์ : ํ row์ ํ๊ฐ์ ํธ๋ง ์กด์ฌํ ์ ์๋ค๊ณ ํด์ํ ์ ์๋ค.
๋งจ์์ ํธ์ ๋ฐฐ์นํ๊ณ ํด๋น ํธ์ด ์ด๋ํ ์ ์๋ ์์น์ ๋ค์ ํธ์ ๋ฐฐ์นํ๋ฉด ๋๋ค. ๋ง์ฝ ํธ์ ๋ฐฐ์นํ ์ ์๋ค๋ฉด, ๊ทธ ์ ๋จ๊ณ๋ก ๋์๊ฐ์ ์ฌ๋ฐฐ์นํ๋ค

์กฐ๊ฑด ์ฒดํฌ
1. ์์ง ์ฒดํฌ
ํธ์ ์ขํ๊ฐ (1,2) ๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์ด ํธ์ ๋ชจ๋ (x,2)๋ก ์ด๋ํ ์ ์๋ค.
์ฆ, ํด๋น column (y์ขํ) ์๋ ๋์ด์ ํธ์ ๋ฐฐ์นํ ์ ์๋ค! ํ column์๋ ํ๋์ ํธ๋ง ์กด์ฌํ ์ ์๋ค.
2. ์ํ ์ฒดํฌ
ํธ์ ์ํ์ผ๋ก ์ด๋ํ ์ ์๋ค. ์ฆ, ํ row์๋ ํ๋์ ํธ๋ง ์กด์ฌํ ์ ์๋ค.
3. ๋๊ฐ์ ์ฒดํฌ

์์ ์กฐ์กํ๊ฒ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ดค๋๋ฐ, ํธ์ ๋๊ฐ์ ์์น์ ์๋ค๋ ๊ฒ์ ์๊ณผ ๊ฐ์ด ์ด๋ฑ๋ณ ์ผ๊ฐํ์ด ๊ทธ๋ ค์ง ์ ์๋ ์์น์ ํธ์ด ๋ฐฐ์น๋๋ค.
์ฆ, |๋ฐฐ์น๋ ํธ์ x ์ขํ - ํ์ฌ ํธ์ x ์ขํ| == |๋ฐฐ์น๋ ํธ์ y ์ขํ - ํ์ฌ ํธ์ y ์ขํ| ์ผ๋ ์ด ํธ๋ค์ ๋๊ฐ์ ์์ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์, ์ด๋ฅผ ์๋ ์ฝ๋๋ก ๊ตฌํํด๋ณด๋ฉด ์๋์ ๊ฐ์ ์กฐ๊ฑด์์ ๋์ถํ ์ ์๋ค.
if ( abs(queen.col - curr_queen.col) == abs(queen.row - curr_queen.col) ) continue; //๋๊ฐ์ ์
else {
//other code
}
์์ ์ ์๋ ์กฐ๊ฑด๋ค๋ก ๊ฐ์ง์น๊ธฐ๋ฅผ ํ๊ณ dfs ๋ฐฉ์์ผ๋ก ํ์ด๋ณธ๋ค๋ฉด n ํธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ฐฑ์ค 9663 N-Queen
๋ฐฑ์ค ๋ฌธ์ ๋ฅผ ํ๊ณ ์๋ค..
2์ฐจ์ ๋ฐฐ์ด๋ก ํ ์ ์์ ์ค ์์๋๋ฐ ์๊ฐ์ฒ๋ผ ์ ์๋๋ค. ๊ตฌ๊ธ์ ๊ฒ์ํด๋ณด๋ ์๋ ์ด๋ด์๊ฐ..๋ค๋ค 1์ฐจ์ ๋ฐฐ์ด๋ก ํด๊ฒฐํ๋ค๋ ์ด๋์ ์ด๋ฆด๋ ์ฑํฌ๋น ์ ํ์ด์ผ..
1 ์ฐจ์ ๋ฐฐ์ด๋ก ํํ
//1์ฐจ์ ๋ฐฐ์ด
int[] board = new int[N];
1์ฐจ์ ๋ฐฐ์ด๋ก ์ด๋ป๊ฒ ํํํ๋ ํ๋ฉด, ๊ฐ ์ธ๋ฑ์ค๊ฐ row ๋ก ์น๋๊ฑฐ๋ค.
์์ ๋งํ๋ฏ์ด, N queen์ ์ ์ฝ ์กฐ๊ฑด์์ ํ row์ ํ๋์ ํธ๋ง ์กด์ฌํ ์ ์๋ค. ๋ฐ๋๋ก ๋งํ์๋ฉด ๋ชจ๋ row์๋ ํ๋์ ํธ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ 1์ฐจ์ ๋ฐฐ์ด๋ก ํํํ๋ฉด index๊ฐ ํธ์ row๊ณ , ๋ด์ฉ๋ฌผ์ด column์ ์์น๋ผ๊ณ ๋งํ ์ ์๊ฒ ๋ค.
| index (row) | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| column | y0 | y1 | y2 | y3 | y4 | y5 | y6 |
์ ํ ์ด๋ธ์ ๋ณด๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
์๋ฅผ๋ค์ด, board[2] = 3์ด๋ผ๋ฉด, x = 2, y = 3 ์ธ (2,3) ์ ํธ์ด ์กด์ฌํ๊ณ ์๋ค๋ ์๋ฆฌ๋ค!
DFS
private static void dfs(int row) {
if(row == N) {//๋๊น์ง ๋์ฐฉ
answer++;
return;
}
for(int i = 0 ; i<N ;i ++) {
board[row] = i; //row ๊ฐ 1์ด๋ผ๋ฉด, ํธ์ i ๋ฒ์งธ column์ ์์น์์ผ๋ณด๊ณ ๋ ์ ์๋์ง ์๋์ง ํ๋จ
if(check(row)) {//ํด๋น row์ ๋์ col ์ ๋ณด๊ฐ ๊ด์ฐฎ์๊ฐ..
dfs(row+1); //๋ค์ row์ ๋์
}
//else : ๋ค์ col ์ ์ ํ ๋ฐ๋ณต
}
}
์ ์ฝ๋๋ dfs์ฝ๋์ด๋ค.
๋จผ์ , for loop๋ฅผ ์ฌ์ฉํ์ฌ, column ์์น๋ฅผ ์ ํ๋ค
for(int i = 0 ; i<N ;i ++){
board[row]=i;
}
์ ์ฝ๋๊ฐ column์ ์ค์ ํ๊ฒ ํด์ค๋ค.
if(check(row)) {//ํด๋น row์ ๋์ col ์ ๋ณด๊ฐ ๊ด์ฐฎ์๊ฐ..
dfs(row+1); //๋ค์ row์ ๋์
}
์ ์ฝ๋๋, ํด๋น row์ ๋ฐฉ๊ธ ๋์ ํ column๊ฐ์ด ๊ด์ฐฎ์์ง ์๋์ง ํ์ธํ๋ ๋ฉ์๋๋ก ํธ์ถํ ํ ๋ง์ผ ๊ด์ฐฎ๋ค๋ฉด ๋ค์ row๋ก ๋์ด๊ฐ๋ ์ฝ๋์ด๋ค.
์ฆ, (0,0) ์ด validation check์์ ํจ์คํ๋ค๋ฉด, ๋ค์ (1,y) ์ขํ๋ฅผ ๊ตฌํ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก, check method๋ ์์ ๋งํ ๋๊ฐ์ ๊ณผ column์ ํ์ธํ๋ ์์ ์ ํ๋ค.
private static boolean check(int row) {
for(int i = 0 ; i< row ;i ++) {
if(board[i] == board[row])return false;
//๋๊ฐ์ :row, col
if(Math.abs(i-row)== Math.abs(board[row]-board[i])) return false;
}
return true;
}
if(board[i] == board[row]) ๋ ํด๋น ์ด ์ ๊น์ง๋ง ํ์ํ๋๋ฐ (ํด๋น ์ด๊น์ง๋ง column์ ์ ํ๊ธฐ ๋๋ฌธ์), ๊ฐ์ ํ์ ์ด๋ฏธ ํธ์ด ์กด์ฌํ๋ฉด ํธ์ ๋ฐฐ์นํ ์ ์๋ค.
๋๊ฐ์ ์ฝ๋๋ ์์์ ์ค๋ช ํ ๊ฒ ๊ณผ ๊ฐ์ด ์ด๋ฑ๋ณ ์ผ๊ฐํ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ true์ธ์ง false์ธ์ง ๋ฆฌํดํด์ฃผ์๋ค.
์ check ์ฝ๋์์ true๊ฐ ๋์ค๋ฉด, ์ฌ๊ท๋ฅผ ํตํด ๋ค์ row๋ก ๊ฐ๊ฒ ๋๋ค.
์ด๋ ๊ฒ row๊ฐ N ๊น์ง ๋์ฐฉํ๊ฒ ๋๋ฉด answer ๊ฐ ์ฆ๊ฐํ๊ณ ๋ค๋ฅธ ์ขํ๋ก ์ฌํ์ ์์ํ๋ค.
์ ์ฒด ์์ค ์ฝ๋
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
/**
* @author June Park
* @date 11/08/2021
* N-Queen Problem
* on NxN chessboard, find #sols of n queen
* */
public class BOJ_9663_N_Queen {
static int [] board; //๊ฐ row ๋ง๋ค ํธ์ ๋์ ์ธ๋ฑ์ค ์ ์ฅ
static int N , answer;
public static void main(String[] args) throws Exception{
BufferedReader br= new BufferedReader (new InputStreamReader (System.in));
N = Integer.parseInt(br.readLine());
board = new int [N]; //board[row] = col -> row ๋ง๋ค ํ๋์ ํธ์ ๋์ ์ ์์. board[1] = 1๋ฒ์งธ row์ ํธ์ ๋ชcol์ ๋์๋์ง ์ ์ฅํ๋ค
answer = 0;
dfs(0);
System.out.println(answer);
}
/**
* */
private static void dfs(int row) {
if(row == N) {//๋๊น์ง ๋์ฐฉ
answer++;
return;
}
for(int i = 0 ; i<N ;i ++) {
board[row] = i; //row ๊ฐ 1์ด๋ผ๋ฉด, ํธ์ i ๋ฒ์งธ column์ ์์น์์ผ๋ณด๊ณ ๋ ์ ์๋์ง ์๋์ง ํ๋จ
if(check(row)) {//ํด๋น row์ ๋์ col ์ ๋ณด๊ฐ ๊ด์ฐฎ์๊ฐ..
dfs(row+1); //๋ค์ row์ ๋์
}
//else : ๋ค์ col ์ ์ ํ ๋ฐ๋ณต
}
}
/**
* ํ์ฌ ์์น์ queen ์ด ๊ฐ ์ ์๋์ง ์๋์ง ํ์ธ
* 1. ํธ์ด ๊ฐ์ col์ ์๋ ๊ฒฝ์ฐ : board[row] = col ์์ ์ขํ๋ row, col
* board[row] ์ board[i] ๋ฅผ ๋น๊ตํ๋ฉด ๋์ผํ ์นผ๋ผ์ ์์นํ๋์ง ์ ์ ์์
*
* 2. ๋๊ฐ์ ์ ์กด์ฌ ?
* abs(queen.col - curr.col) == abs(queen.row - curr.row) ๋ฉด ๋๊ฐ์ ์์ ์์
* */
private static boolean check(int row) {
// ๊ฐ์ column์ธ์ง ํ๋จ : board[i] : dfs ๋ฉ์๋์์ board[row] = col ๋ก ์ด๊ธฐํ ์์ผ์คฌ์.
// board[n] ์ column ์ ๋ณด๋ฅผ ๋ด๊ณ ์์. board[i]==board[row] ๊ฐ์ column
for(int i = 0 ; i< row ;i ++) {
if(board[i] == board[row])return false;
//๋๊ฐ์ :row, col
if(Math.abs(i-row)== Math.abs(board[row]-board[i])) return false;
}
return true;
}
}
Reference:
https://www.codesdope.com/course/algorithms-backtracking/
ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ๋ฐ๋ก๊ฐ๊ธฐ๐ https://bit.ly/3FVdhDa
์๊ฐ๋ฃ 100% ํ๊ธ ์ฑ๋ฆฐ์ง | ํจ์คํธ์บ ํผ์ค
๋ฑ 5์ผ๊ฐ ์งํ๋๋ ํ๊ธ์ฑ๋ฆฐ์ง๋ก ์๊ฐ๋ฃ 100% ํ๊ธ๋ฐ์ผ์ธ์! ๋ ๋ฆ๊ธฐ์ ์ ์๊ธฐ๊ณ๋ฐ ๋ง์ฐจ ํ์น!
fastcampus.co.kr
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑ๋์์ต๋๋ค.
'๐ STUDY > FASTCAMPUS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 10์ผ์ฐจ (0) | 2021.11.10 |
|---|---|
| ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 9์ผ์ฐจ (2) | 2021.11.09 |
| ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 7์ผ์ฐจ (0) | 2021.11.07 |
| ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 6์ผ์ฐจ (0) | 2021.11.06 |
| ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 5์ผ์ฐจ (0) | 2021.11.05 |