백준 9663 - N-Queen

🔐 백준 9663 - N-Queen

https://www.acmicpc.net/problem/9663


🔑 풀이

처음 문제에 접근했을 때, $ N \times N $ 크기의 체스판 위에 퀸 N개를 놓아야 된다는 것을 보고

$ N \times N $ 의 (0, 0) 좌표부터 백트래킹을 통해 모든 경우의 수를 계산하는 방식으로 풀어야겠다고

생각했다. DFS 를 이용해서 좌표의 네 방향으로 뻗어나가며 퀸을 놓을 수 있는지 없는지를 판단하고

가지치기를 진행해야겠다고 생각했지만, 퀸의 특성 상, 동일한 x, y 좌표에는 다른 퀸을 놓을 수가 없기

때문에, 굉장히 비효율적인 방법임을 깨달았다.

우선, 퀸은 같은 x, y좌표와 대각선으로 이동할 수 있다. x, y 좌표의 경우 조사하려는 x, y 좌표와

같은지만 조사하면 되기 때문에 쉽게 해결할 수 있지만, 대각선의 경우 코드로 어떻게 표현해야 할지 몰랐다.

2차원 배열에서 대각선은 다음과 같은 특성을 가지고 있었다.

위 두 특성을 조합하면 $ \vert row1 - row2 \vert = \vert col1 - col2 \vert $ 가 되며, 쉽게 코드로 나타낼 수 있다.

$ 4 \times 4 $ 크기의 체스판에 4개의 퀸을 놓는 경우를 예시로 들어보면, 우선 (0, 0)에 퀸을 놓은 경우

0행의 다른 칸은 생각할 필요가 없다. 따라서 2차원 배열을 만들 필요가 없으며, 1차원 배열로도 문제를

해결할 수 있다. 이제 1행에 퀸을 놓을 수 있는지를 확인하고, (1, 2), (1, 3)에 놓을 수 있으므로, 각각에

대해 실행시켜 줄 것이다. 이러한 방식으로 코드를 짜주면 해결할 수 있다.


🧩 코드

  • isSafe() 함수를 사용하여 반복문을 통해 열과 대각선을 체크하는 것은 연산 횟수를 많이 쓰게 됨.

  • 따라서 열과 대각선 2개에 대한 배열을 통해 같은 열과 대각선 상에 퀸이 존재하는 지를 체크하는 방법을
    사용하면 시간을 단축시킬 수 있음.

Categories:

Updated:

Leave a comment