• TOC {:toc}

이 글은 백준 온라인 저지의 9663번 문제를 풀이한 것을 모아놓은 글입니다.

일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.

2021.07.21 (Python)

메모리 시간 코드 길이
216340 KB 31868 ms 397 B
단계 시작 시각 끝난 시각 걸린 시간
문제 이해 21:19:27 21:20:27
풀이 생각 21:20:30 21:36:49
코딩 21:38:13 22:09:45
디버깅 1 12:42:05 13:09:00
디버깅 2 14:17:05 14:45:55
def adjacent(x):
    for i in range(x):
        if row[x] == row[i] or abs(row[x] - row[i]) == x - i:
            return False
    return True
        

def dfs(x):
    global result
    if x == N:
        result += 1

    else:
        for i in range(N):
            row[x] = i
            if adjacent(x):
                dfs(x + 1)

N = int(input())
row = [0] * N
result = 0
dfs(0)
print(result)

아이디어 & 풀이

백 트래킹의 대표적인 예시인 N Queen 문제이다.

  • dfs를 이용해 각 열을 탐색하면서 더는 queen을 놓을 수 없으면 drop 한다.
  • N Queen과 백 트래킹에 대한 자세한 내용은 [[wiki0:fc-algo-algorithm-21-back-tracking]]{강의 정리글}을 참고하면 된다.

디버그

  • 작성했더니 시간초과가 나서 dfs를 queue 이용해서 구현하다가 포기했다. 훨씬 복잡해지기만 하는 듯.
  • 관련 글을 검색해봤더니 정석적으로 풀면 파이썬에서는 시간 내에 풀기 어려운 알고리즘인 것 같다. PyPy도 사소한 것에 따라 간당간당하게 통과하는듯하다.

피드백

2022.04.08 (JS)

메모리 시간 코드 길이
10216 KB 7520 ms 654 B
단계 시작 시각 끝난 시각 걸린 시간
문제 이해 23:49:50 23:50:03
풀이 생각 23:50:04 23:50:28
코딩 23:55:05 00:13:26
const fs = require("fs");
const input = fs.readFileSync('/dev/stdin').toString().trim();

function main() {
    function isAvailable(x) {
        // iterate rows upper x
        for (let i = 0; i < x; i += 1) {
            if (row[i] === row[x] || Math.abs(row[x] - row[i]) === x - i) return false;
        }
        return true;
    }

    function dfs(x) {
        if (x === N) count += 1;
        else {
            for (let i = 0; i < N; i += 1) {
                // put queen at i, x
                row[x] = i;
                if (isAvailable(x)) dfs(x + 1);
            }
        }
    }

    // row[row] = col
    const row = Array(N);
    let count = 0;
    dfs(0);

    return count;
}

const N = parseInt(input);

console.log(main());

참고 답안 1

아이디어 & 풀이

참고 답안 2

print(
    [0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596][int(input())]
)

아이디어 & 풀이

N에 따른 N Queen의 경우의 수를 리스트로 만들어서 N에 따라 출력한다.

  • 수행 시간이 두 자리 ms 단위인 답안은 대부분 이 풀이이다.
  • 세~네 자리 ms 단위인 답안도 대부분 N이 큰 경우는 답안을 직접 출력하고 넘어가 시간을 단축시킨 것이었다.
    • 아마 시간 때문에 통과가 안 되는 경우를 제외시키고 작성한 코드가 맞는지 확인하려고 한 것 같다.
  • 알고리즘적으로는 의미가 없는 답안에 가깝지만 일단 작성.