본문 바로가기

IT/알고리즘(Algorithm)

여왕말 문제(N queens problem)



문제


Eight Queens Problem : 8 x 8 의 판에 퀸 8개를 배치할 때 서로를 공격할 수 없게 배치하는 모든 경우의 판을 출력하시오.



아이디어


간단하게 생각해보면 퀸이 놓였을 경우, 또 다른 퀸을 놓을 수 없는 위치를 고려해보자.

하나의 퀸이 이동할 수 있는 경로는 퀸의 가로, 세로, 대각선, 역대각선 방향으로만 움직일 수 있다.


이를 그림을 통해 살펴보자. 


▣ : 퀸의 위치

▩ : 퀸이 이동할 수 있는 경로

□ : 퀸이 이동할 수 없는 경로






위에는 총 9개의 예시를 보이고 있다.

각각의 예시는 한개의 퀸 배치 때 퀸이 이동할 수 있는 경로와 이동할 수 없는 경로를 표현한다.


그렇다면 다음과 같이 생각하면 문제를 간단하게 해결할 수 있다.




다음과 같이 총 9 x 9  

81개의 배치가능 공간을 9개의 라인으로 나눈다.


1번 라인에 하나를 배치하게 된다면


이제 1번 라인에는 배치할 수 없고 다음 라인에 배치해야한다. (퀸은 세로로 이동가능하기 때문이다.)


1번 라인에 배치한 후, 다음 배치공간인 2번 라인에 배치하는데,


만약 2번의 첫번 째 라인에 배치한다면


1번라인의 퀸이 이동할 수있는 경로이기 때문에 2번라인에서 다음과 같은 배치가 불가능하다.


이와 같은 논리로 생각해보면


1번라인에서 첫번째 배치후 

2번라인에서 첫번째 배치가 된 경우는 

다음라인(3~9) 배치에 어떠한 퀸을 배치한다 해도 불가능한 경우가 되는 것이다.



그렇다면 위와 같이 배치된 경우는 다음라인에 어떠한 퀸을 배치한다 해도 불가능하기 때문에 

n queen문제의 적합하지 않은 경우이다.

이를 가능성없는 패라고 하는 데

유망성(Promising)이라고 부르겠다.



그렇다면 이렇게 유망성 없는 패는 더이상 체크할 가치가 없으며 체크하게 된다하면 이는 불필요한 연산일 것이다.



다음과 같이 X표시가 된곳은 더이상 다음 라인의 배치할 경우를 고려하지 않아도 되는 것이다.



이를 기반으로 생각해보면 재귀함수를 정의함으로써 다음과 같은 문제를 해결할 수 있다.


총 8개의 배치를 할경우 지속적으로 다음줄에 배치를 해가며, 

유망성없는 패일 경우는 고려하지않고 다음 배치를 생각하면서 체크하는 코드를 작성하면 된다.


이와 같은 알고리즘을 백트래킹(backtraking)이라고 한다.


그렇다면 다음 문제에서의 탈출조건을 고려해보자.

만약 8개의 배치중 총8개의 배치가 성립된 경우는 완전한 해이기 때문에 재귀 함수의 탈출 조건이된다.




소스코드












'IT > 알고리즘(Algorithm)' 카테고리의 다른 글

BAEKJOON 4673번  (1) 2017.10.22
BAEKJOON 2839번  (0) 2017.10.20