-
728x90๋ฐ์ํ
๋ ์ง : 2021 ๋ 11 ์ 8 ์ผ
์์ฒญ ๊ฐ์ : ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ์ดํด (1)๋ฒ์จ 8์ผ์ฐจ๋ผ๋..์ ๊ธฐํ๋ค..
์ค๋์ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ์ดํด (1)์ ๋ค์๋ค. ํฌ์คํ ์์ฑ ํ, N ํธ์ ์ง์ ๊ตฌํํด๋ณด๊ณ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ์ดํด (2)๋ฅผ ๋ฃ๋๊ฒ ๋์ ๊ฒ ๊ฐ๋ค.
์ ๋์จ์ด..๋ฐฑํธ๋ํน
์ ์ฝ ์กฐ๊ฑด ๋ง์กฑ ๋ฌธ์ ์์ ํด๋ฅผ ์ฐพ๊ธฐ ์ํ ์ ๋ต
ํด๊ฐ ๋ ์ ์๋ ๋ค์ํ ํ๋ณด๊ทผ์ ํธ๋ฆฌ ํํ๋ก ํํ (State Space Tree)
์ง์ง ํธ๋ฆฌ๋ ์๋๊ณ , dfs ๋ก ํ ์ ์๋ค.How it works...
1. ๋ฃจํธ ๋ ธ๋๋ฅผ ํ๋ ์ก์์, ํด๊ฐ ๋ ์ ์๋์ง ํ๋จ
2. ํด๊ฐ ๋ ์ ์๋ค๋ฉด ํด๋น ํด์ child ๊ฐ ํด๊ฐ ๋ ์ ์๋์ง ํ๋จ
3. ํด๊ฐ ๋ ์ ์๋ค๋ฉด, ๋ค์ ๊ทธ ์ ์กฐ๊ฑด์ผ๋ก ๋์๊ฐ๋ค.
์ด๋, ํด๊ฐ ๋ ์ ์๋ ๋ ธ๋์ ์์๋ค์ ํ์ธํด๋ณด์ง ์์๋ ํด๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ง๋ค์ ํ์ธํ ํ์๊ฐ ์์ด์ง๋๋ฐ ์ด๋ฅผ ๊ฐ์ง์น๊ธฐ๋ผ๊ณ ํ๋ค.
4. ์ ๊ณผ์ ์ ์ต์ข ํด๋ฅผ ์ฐพ์ ๋ ๊น์ง ๋ฐ๋ณต
์ด๋ฏธ์ง ์ถ์ฒ : ResearchGate ๋ํ ๋ฌธ์ : N Queen
์ด๋ฏธ์ง ์ถ์ฒ : codesdope 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, colif(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] ๊ฐ์ columnfor(int i = 0 ; i< row ;i ++) {if(board[i] == board[row])return false;//๋๊ฐ์ :row, colif(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
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑ๋์์ต๋๋ค.
728x90๋ฐ์ํ'๐ STUDY > FASTCAMPUS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 10์ผ์ฐจ (0) 2021.11.10 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 9์ผ์ฐจ (0) 2021.11.09 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 7์ผ์ฐจ (0) 2021.11.07 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 6์ผ์ฐจ (0) 2021.11.06 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 5์ผ์ฐจ (0) 2021.11.05