쥐수의 공부노트

백준 9663번 N-Queen 본문

바킹독 알고리즘/백트래킹

백준 9663번 N-Queen

쥐수 2023. 7. 19. 15:45
728x90

정답 : 

let n = Int(readLine()!)!
var issue1 = Array(repeating: false, count: n) // column을 차지하고 있는지
var issue2 = Array(repeating: false, count: 2 * n - 1) // / 방향 대각선을 차지하고 있는지
var issue3 = Array(repeating: false, count: 2 * n - 1) // \ 방향 대각선을 차지하고 있는지
var cnt = 0
func check(num : Int) { // cur번째 row에 말을 배치할 예정임
    if num == n { // N개를 놓는데 성공했다면
        cnt += 1
        return
    }
    for i in 0..<n { // (cur, i)에 퀸을 놓을 예정
        if issue1[i] || issue2[i + num] || issue3[num - i + n - 1] { // column이나 대각선 중에 문제가 있다면
            continue
        }
        issue1[i] = true
        issue2[i+num] = true
        issue3[num-i+n-1] = true
        check(num: num + 1)
        issue1[i] = false
        issue2[i+num] = false
        issue3[num-i+n-1] = false
    }
}
check(num: 0)
print(cnt)

해당 문제는 그 자리에 놓여 있는 경우를 true로 잡고 진행한다.

 

따라서 / 방향 대각선이나, \ 방향 대각선에도 true가 있다면 놓을수 없으니 넘어간다.

 

골드 문제라 그런지 너무 어려운 것 같다.

 

728x90

'바킹독 알고리즘 > 백트래킹' 카테고리의 다른 글

백준 1182번 부분수열의 합  (0) 2023.07.20
백준 15649번 N과 M (1)  (0) 2023.07.12