input: 정수 n
output: n X n 크기의 체스판에 n개의 퀸을 서로 공격하지 못하는 위치에 놓을 수 있는 경우의 수 리턴
• 1 <= n <= 9
퀸이 서로 공격하지 못하는 위치
DFS/구현
class Solution {
var n = 0
var result = 0
fun totalNQueens(n: Int): Int {
this.n = n
queen(Array<String>(n){".".repeat(n)}, Array(n){-1}, 0)
return result
}
fun queen(board: Array<String>, visited: Array<Int>, height: Int) {
if (height == n) { // n개의 퀸을 모두 놓았을 경우 결과 추가
result++
return
}
for (c in 0 until n) { // 각 col에 대하여 퀸을 놓을 수 있는 지 확인
if (visited[c] == -1) { // 같은 col에 놓인 퀸이 없다면
var canAttack = false
for (j in 0 until n) { // 대각선에 위치한 퀸이 있는지 확인
if (visited[j] != -1 && Math.abs(c - j) == Math.abs(height - visited[j])) {
canAttack = true
}
}
if (!canAttack) { // 대각선에 위치한 퀸이 없는 경우
val tmp = ".".repeat(c)+"Q"+".".repeat(n - c - 1)
board[height] = tmp
visited[c] = height
queen(board, visited, height + 1)
visited[c] = -1
board[height] = ".".repeat(n)
}
}
}
}
}
시간 복잡도: 깊이 탐색(DFS) X 배열 순회(col) X 배열 순회(대각선) = n^3