๋ฌธ์
ํ์ด ์ธ์ด
Kotlin
์ฝ๋
import java.util.*
import kotlin.math.abs
lateinit var array: Array<Int>
var n = 0
var cnt = 0
fun main() = with(Scanner(System.`in`)) {
n = nextInt()
array = Array(n) { 0 }
nQueen(0)
println(cnt)
}
fun nQueen(depth: Int) { // depth๋ row
if (depth == n) {
println(depth)
cnt++
return
}
for (i in 0 until n) { // i๋ col
array[depth] = i
if (check(depth)) {
nQueen(depth + 1)
}
}
}
fun check(row: Int): Boolean {
for (i in 0 until row) {
// 1. ์ด์ ์ด (์ ์ฅ๋์ด ์๋ ๊ฐ) ๊ณผ ๋น๊ต, index ๊ฐ์ด row ์ด๋ฏ๋ก ํ์ ๋ฌด์กฐ๊ฑด ๋ค๋ฆ
if (array[row] == array[i]) return false
// 2. ๋๊ฐ์ ๋น๊ต
else if (abs(array[row] - array[i]) == abs(row - i)) return false
}
return true
}
ํ์ด ๋ฐฉ๋ฒ
์ฐ์ N-Queen
๋ฌธ์ ์ ๋ํด ์์๋ณด์.
์ฒด์ค์์ Queen
์ ์, ํ, ์ข, ์ฐ, ๋๊ฐ์ ์ผ๋ก ๋์๊ฐ ์ ์๋ค. ์ด๋ฌํ Queen ์ ์๋ก ๊ฒน์น์ง ์๊ฒ ์ฒด์คํ ์์ ๋ฐฐ์นํ๋ ๋ฌธ์ ๊ฐ N-Queen
๋ฌธ์ ์ด๋ค. Quuen ์ ๊ฒน์น์ง ์๊ฒ ๋ฐฐ์นํ๊ธฐ ์ํด์๋ ์๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ํ๋์ Queen ์ ์, ํ, ์ข, ์ฐ ์๋ ๋ค๋ฅธ Queen ์ด ์กด์ฌํ์ง ์๋๋ค.
- ํ๋์ Queen ์ ๋๊ฐ์ ์๋ ๋ค๋ฅธ Queen ์ด ์กด์ฌํ์ง ์๋๋ค.
์ธ๋ป ๋ณด๋ฉด 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ ๊ฒ ๊ฐ์ง๋ง, 1์ฐจ์ ๋ฐฐ์ด๋ก๋ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค. 1์ฐจ์ ๋ฐฐ์ด์ index
๋ฅผ Row
๋ก, ํด๋น ์์๋ฅผ Col
์ผ๋ก ์ฌ์ฉํ๋ฉด 2์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด๋ก ํํํ ์ ์๊ฒ ๋๋ค.
1. ์ฐ์ ์ฒซ๋ฒ์งธ ํ (์ฒด์คํ์ ๋งจ ์) ๋ถํฐ ์์ํ๋ค.
fun main() = with(Scanner(System.`in`)) {
n = nextInt()
array = Array(n) { 0 }
nQueen(0)
println(cnt)
}
2. array[0] = 0, ์ฆ (row = 0, col = 0) ์ Queen ์ ๋ฐฐ์นํ๋ค.
fun nQueen(depth: Int) { // depth๋ row
if (depth == n) {
cnt++
return
}
for (i in 0 until n) { // i๋ col
array[depth] = i
if (check(depth)) {
nQueen(depth + 1)
}
}
}
3. ์ด ๋, ํด๋น ์์น๋ฅผ ๊ฒ์ฆํ๋ค. ์, ํ, ์ข, ์ฐ, ๋๊ฐ์ ์ ํ๋จํ๋๋ฐ ๋๊ฐ์ ์ ๊ฒ์ฆํ ๋ abs
๋ฅผ ํ์ฉํ๋ฉด ์ข ํจ์จ์ ์ผ๋ก ๊ณ์ฐํ ์ ์๋ค. abs(array[row] - array[i])
๋ ๋ Queen ๊ฐ์ col
์ฐจ์ด๋ฅผ ์๋ฏธํ๊ณ , abs(row - i)
๋ ๋ Queen ๊ฐ์ row
์ฐจ์ด๋ฅผ ์๋ฏธํ๋ค. ์ด ๊ฐ์ด ๊ฐ์ผ๋ฉด ์๋ก ๋๊ฐ์ ์์ผ๋ก ์กด์ฌํ๋ ๊ฒ์ด๋ฏ๋ก ์ข
๋ฃํ๋ค.
fun check(row: Int): Boolean {
for (i in 0 until row) {
// 1. ์ด์ ์ด (์ ์ฅ๋์ด ์๋ ๊ฐ) ๊ณผ ๋น๊ต, index ๊ฐ์ด row ์ด๋ฏ๋ก ํ์ ๋ฌด์กฐ๊ฑด ๋ค๋ฆ
if (array[row] == array[i]) return false
// 2. ๋๊ฐ์ ๋น๊ต
else if (abs(array[row] - array[i]) == abs(row - i)) return false
}
return true
}
๊ฒฐ๊ณผ
์ฐธ๊ณ ์๋ฃ
'โ๏ธ ์ฝํ ์ค๋น > Back Tracking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑํธ๋ํน / Kotlin] BOJ 1759 - ์ํธ ๋ง๋ค๊ธฐ (0) | 2022.04.10 |
---|---|
[๋ฐฑํธ๋ํน / Kotlin] BOJ 1987 - ์ํ๋ฒณ (0) | 2022.04.10 |
[๋ฐฑํธ๋ํน / Kotlin] BOJ 14888 - ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (0) | 2022.03.31 |
[๋ฐฑํธ๋ํน / Kotlin] BOJ 2580 - ์ค๋์ฟ (0) | 2022.03.30 |
[๋ฐฑํธ๋ํน / Kotlin] BOJ 15649 ~ 15652 - N๊ณผ M (1 ~ 4) (0) | 2022.03.28 |