Problem
Solution
ํด๋น ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน(DFS)์ผ๋ก ํ์ด์ผ ํ๋ ๋ฌธ์ ์ ๋๋ค.
1. ๊ฐ ํ๋ง๋ค ํธ์ ๋์ ์ ์๋ ์์น๋ฅผ ์ฒดํฌํ๋ค.
๊ฐ ํ๋ง๋ค ํธ์ ํ๋์ฉ๋ฐ์ ๋ชป๋์ผ๋ฏ๋ก ํ์ฌ ํ์ ์ด๋ค์ ๊ณต๊ฒฉํ ์ ์๋ ํธ์ด ์๋์ง ์ฒดํฌํฉ๋๋ค.
๋ง์ฝ ๊ณต๊ฒฉํ ์ ์๋ ํธ์ด ์๋ค๋ฉด ํ์ฌ ์์น๋ฅผ history(ํธ์ ์์น๋ฅผ ์ ์ฅํ๋ 2์ฐจ์ ๋ฐฐ์ด)์ ์ ์ฅํด๋๊ณ ๋ค์ ํ์ผ๋ก ์งํํฉ๋๋ค.
์ด๋ ๊ฒ ์งํํ๋ฉด์ ๊ฐ์ฅ ๋ง์ง๋ง ํ๊น์ง ๋๋ฌํ ๊ฒฝ์ฐ๋ ๋ฐฐ์นํ ์ ์๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก answer(๋ฐฐ์นํ ์ ์๋ ๊ฒฝ์ฐ ์)๋ฅผ +1 ์ฆ๊ฐ์์ผ์ค๋๋ค.
func findEnableArrange(n:Int,depth:Int,history:[[Bool]],answer:inout Int) {
//๊ฐ์ฅ ๋ง์ง๋ง๊น์ง ์์ ๊ฒฝ์ฐ
if depth == n {
//๋ฐฐ์น ๊ฐ๋ฅํ ๊ฒ์ด๋ฏ๋ก +1 ํด์ค
answer += 1
return
}
//ํ์ฌ ํ์ ํธ์ ๋์ ์ ์๋์ง ํ์ธ
for x in 0..<n {
//๊ณต๊ฒฉํ์ง ๋ชปํ๋ค๋ฉด
if isUnableAttack(history: history, x: x, y:depth) {
var newHistory = history
newHistory[depth][x] = false
//dfs๋ก ์งํ
findEnableArrange(n: n, depth: depth+1,history: newHistory,answer: &answer)
}
}
}
2. ๊ณต๊ฒฉํ ์ ์๋ ํธ์ด ์๋์ง ์ฒดํฌํ๋ค.
๊ณต๊ฒฉํ ์ ์๋ ํธ์ ์ธ๋ก๋ฐฉํฅ ๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ ๋ฐฉํฅ์ ํธ์ด ์๋์ง๋ง ์ฒดํฌํ๋ฉด ๋ฉ๋๋ค.
์ธ๋ก๋ฐฉํฅ์ ํ์ฌ x์ ๋ชจ๋ ํ์ ๊ฒ์ฌํ๋ฉด ๋๊ณ
๋๊ฐ์ ์ผ ๊ฒฝ์ฐ์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ ์ ํธ์ด ์๋์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ (x,y)์ ๋ชจ๋ ๋๊ฐ์ ๋ฐฉํฅ์ ๊ตฌํ ๋ ๊ท์น์ ์ผ์ชฝ ๋ฐฉํฅ์ผ ๊ฒฝ์ฐ (x-abs(y-i),i)๋ฅผ ์ฒดํฌํ๋ฉด ๋๊ณ
์ค๋ฅธ์ชฝ์ ๊ฒ์ฌํ ๊ฒฝ์ฐ (x+abs(y-i),i)๋ฅผ ์ฒดํฌํ๋ฉด ๋ฉ๋๋ค.
//๊ณต๊ฒฉ์ด ๋ถ๊ฐ๋ฅํ์ง ์ฒดํฌํ๋ค
func isUnableAttack(history:[[Bool]],x:Int,y:Int) -> Bool {
for i in 0..<history.count {
//์ธ๋ก ํ์ธ
if !history[i][x] {
return false
//๋๊ฐ์ ์ผ๋ก ์ผ์ชฝ ํ์ธ
}else if 0..<history.count ~= x-abs(y-i) && !history[i][x-abs(y-i)] {
return false
//๋๊ฐ์ ์ผ๋ก ์ค๋ฅธ์ชฝ ํ์ธ
}else if 0..<history.count ~= x+abs(y-i) && !history[i][x+abs(y-i)] {
return false
}
}
return true
}
์๋ฅผ ๋ค์ด ํ์ฌ ์์น๊ฐ 2,2๋ผ๋ฉด x =2 ์ด๊ณ y=2 ์ ๋๋ค.
์ผ์ชฝ ๋ฐฉํฅ์ ๋๊ฐ์ ์ 0๋ถํฐ n-1๊น์ง ๊ฒ์ฌํ๋ค๋ฉด 0๋ฒ์งธํ์ (2 - abs(2-0),0) = (0,0)์ ์ฒดํฌํด์ค๋๋ค.
์ค๋ฅธ์ชฝ๋ ๋ง์ฐฌ๊ฐ์ง๋ก 0๋ฒ์งธ ํ์ ๊ฒ์ฌํ๋ค๋ฉด (2 + abs(2-0),0) = (4,0)์ ์ฒดํฌํด์ฃผ๋ฉด ๋ฉ๋๋ค.
3. ๋ฐฐ์น ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์๋ฅผ ๋ฐํํด์ค๋๋ค.
return answer
Source Code
P.S
๋ฐฑํธ๋ํน ๋ฌธ์ ๋ผ๊ณ ํด์ ์ข ๊ฒ๋จน์๋๋ฐ ๊ทธ๋ฅ ๋ฐฑํธ๋ํน์ด DFS๊ตฌ๋ ๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๋ ํธ์ ์์น๋ฅผ ๊ทธ๋ฅ ๊ฐ์ ํ์์ x๋ฒ์งธ๋ค๋ง ๊ฒ์ฌํ๋ฉด ๋๋๋ฐ ๋ฐ๋ณด๊ฐ์ด ๋ชจ๋ ํ๊ณผ ๋ชจ๋ ์ด์ ๊ฒ์ฌํ๊ฒ ๊ตฌํํด์
์๊ฐ์ด๊ณผ๊ฐ ๋ฌ์๋ค...
๋ค๋ฅธ ์ฌ๋ ํ์ด ์ค ์ข๋ค๊ณ ์๊ฐํ๋ ํ์ด
์๋์ ๊ฐ์ด ๋๊ฐ์ ์ ์ฒดํฌํ ๋ abs(x-i) - abs(y-chess[i])๋ก ์ฒดํฌํ๋ฉด ํจ์ฌ ๊ฐ๋จํ๊ฒ ๊ตฌํ ์ ์์๋ค.
func solution(_ n:Int) -> Int {
var chess = [Int].init(repeating: -1, count: n)
var answer = 0
func check(_ x: Int, _ y: Int) -> Bool {
for i in 0..<x {
if chess[i] == y || abs(x - i) - abs(y - chess[i]) == 0 { return false }
}
return true
}
func dfs(_ cnt: Int) {
if cnt == n {
answer += 1
return
}
for i in 0..<n {
if check(cnt, i) {
chess[cnt] = i
dfs(cnt + 1)
chess[cnt] = -1
}
}
}
dfs(0)
return answer
}
๋๊ธ