๋ฌธ์
ํ์ด ์ธ์ด
Kotlin
์ฝ๋
import java.util.*
import kotlin.system.exitProcess
lateinit var board: Array<Array<Int>>
fun main() = with(Scanner(System.`in`)) {
board = Array(9) { Array(9) { 0 } }
// ์ฃผ์ด์ง ๋ฐฐ์ด์ ์
๋ ฅ๋ฐ์
for (i in 0 until 9) {
for (j in 0 until 9) {
board[i][j] = nextInt()
}
}
// (0, 0) ๋ถํฐ ์์
sudoku(0, 0)
}
fun check(row: Int, col: Int, value: Int): Boolean {
// 1. ๊ฐ์ ํ, ๋ค๋ฅธ ์ด์ ๊ฐ์ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
for (i in 0 until 9) {
if (board[row][i] == value) return false
}
// 2. ๋ค๋ฅธ ํ, ๊ฐ์ ์ด์ ๊ฐ์ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
for (i in 0 until 9) {
if (board[i][col] == value) return false
}
// 3. (3x3) ๋ธ๋ญ ๋ด๋ถ์ ๊ฐ์ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
// ํ์ฌ ์์น๊ฐ ์ด๋ ์์น์ (3x3) ๋ธ๋ญ์ ์๋์ง๋ฅผ ์ฐ์ ํ์ธ
val r_index = row / 3 * 3
val c_index = col / 3 * 3
for (i in 0 until 3) {
for (j in 0 until 3) {
if (board[r_index + i][c_index + j] == value) return false
}
}
return true
}
fun sudoku(row: Int, col: Int) {
if (col == 9) {
sudoku(row + 1, 0)
return
}
if (row == 9) {
val stringBuilder = StringBuilder()
board.map {
it.iterator().forEach { e ->
stringBuilder.append(e).append(' ')
}
stringBuilder.append('\n')
}
println(stringBuilder)
// ์์คํ
์ข
๋ฃ
exitProcess(0)
}
if (board[row][col] == 0) {
for (i in 1..9) {
if (check(row, col, i)) {
board[row][col] = i
sudoku(row, col + 1)
}
}
board[row][col] = 0
return;
}
sudoku(row, col + 1)
}
ํ์ด ๋ฐฉ๋ฒ
์ค๋์ฟ ๋ ์๋์ ๊ฐ์ ๊ท์น์ ๊ฐ๋๋ค.
- ๊ฐ์ ํ์๋ 1 ~ 9 ๊ฐ ์ค๋ณต ์์ด ์กด์ฌํ๋ค.
- ๊ฐ์ ์ด์๋ 1 ~ 9 ๊ฐ ์ค๋ณต ์์ด ์กด์ฌํ๋ค.
- ๊ฐ์ ๋ธ๋ญ (3x3) ์๋ 1 ~ 9 ๊ฐ ์ค๋ณต ์์ด ์กด์ฌํ๋ค.
์ ๊ท์น์ ๋ฐ๋ผ ๋ฐฑํธ๋ํน
์ผ๋ก ๊ตฌํํ๋ค.
ํ์ง๋ง ์ค์ํ ๊ฒ
์ด ํ ๊ฐ์ง ์๋ค. ํ์ฌ ์ข์ธก ์๋จ๋ถํฐ ๊ฐ์ ๋ฃ์ด์ฃผ๋๋ฐ ํด๋น ์์น์ ๊ฐ์ด 0
์ธ ๊ฒฝ์ฐ์ ์ค๋ณต ์ฌ๋ถ๋ฅผ ํ๋ณํ๊ณ ๊ฐ์ ์ง์ด๋ฃ์ง๋ง ์งํ ๊ณผ์ ์์ ์ด ๊ฐ์ด ์๋ชป๋ ๊ฐ์ด ๋ ์ ์๋ค. ๊ฐ๋ น 7์ด ๋ค์ด๊ฐ์ผ ํ๋ ์๋ฆฌ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋ค๋ฅธ ์ซ์๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ์ดํ์ ๋ชจ๋ DFS
๋ ์๋ชป๋ ๊ฐ์ด ์ฑ์์ง๊ฒ ๋๋ค. ๋ฐ๋ผ์ ํด๋น ์ง์ ์ 1 ~ 9
๋ก ๋ฐ๊ฟ์ฃผ๋ ์ด๋ฅผ ๋ค์ 0
์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ํ์ํ ์ ์๋๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค. (์ฒ์ ๋ฌธ์ ํ ๋ ์ด ๋ถ๋ถ์ ๋์ณ์ ๊ฐ์ด ์ด์ํ๊ฒ ์ถ๋ ฅ๋์๋ค.)
1. ์ฃผ์ด์ง ์ ๋ ฅ ๊ฐ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
fun main() = with(Scanner(System.`in`)) {
board = Array(9) { Array(9) { 0 } }
// ์ฃผ์ด์ง ๋ฐฐ์ด์ ์
๋ ฅ๋ฐ์
for (i in 0 until 9) {
for (j in 0 until 9) {
board[i][j] = nextInt()
}
}
// (0, 0) ๋ถํฐ ์์
sudoku(0, 0)
}
2. (0, 0) -> (0, 1) ... ์์ผ๋ก ์ฑ์๋๊ฐ๋ค. ์ด ๋ ํด๋น ์์น์ ๊ฐ์ด 0์ธ ๊ฒฝ์ฐ ์ด๋ค ๊ฐ์ ์ฑ์์ค ์ง์ ๋ํด ํ๋ณํ๋ค.
if (board[row][col] == 0) {
for (i in 1..9) {
if (check(row, col, i)) {
board[row][col] = i
sudoku(row, col + 1)
}
}
board[row][col] = 0
return;
}
3. ์ค๋์ฟ ๊ท์น์ ๋ง๊ฒ ์ค๋ณต ๊ฐ ์ฌ๋ถ๋ฅผ ํ๋ณํ๋ค.
fun check(row: Int, col: Int, value: Int): Boolean {
// 1. ๊ฐ์ ํ, ๋ค๋ฅธ ์ด์ ๊ฐ์ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
for (i in 0 until 9) {
if (board[row][i] == value) return false
}
// 2. ๋ค๋ฅธ ํ, ๊ฐ์ ์ด์ ๊ฐ์ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
for (i in 0 until 9) {
if (board[i][col] == value) return false
}
// 3. (3x3) ๋ธ๋ญ ๋ด๋ถ์ ๊ฐ์ ๊ฐ์ด ์กด์ฌํ๋์ง ํ์ธ
// ํ์ฌ ์์น๊ฐ ์ด๋ ์์น์ (3x3) ๋ธ๋ญ์ ์๋์ง๋ฅผ ์ฐ์ ํ์ธ
val r_index = row / 3 * 3
val c_index = col / 3 * 3
for (i in 0 until 3) {
for (j in 0 until 3) {
if (board[r_index + i][c_index + j] == value) 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 9663 - N Queen (0) | 2022.03.29 |
[๋ฐฑํธ๋ํน / Kotlin] BOJ 15649 ~ 15652 - N๊ณผ M (1 ~ 4) (0) | 2022.03.28 |