๋ฌธ์
ํ์ด ์ธ์ด
Kotiln
์ฝ๋
import java.lang.Integer.max
import java.util.*
var n = 0
var m = 0
var max_value = 0
val dx = listOf(-1, 1, 0, 0)
val dy = listOf(0, 0, -1, 1)
lateinit var board: Array<Array<String>>
lateinit var check: Array<Int>
fun main() = with(Scanner(System.`in`)) {
n = nextInt()
m = nextInt()
board = Array(n) { Array(m) { "" } }
check = Array(26) { 0 }
for (i in 0 until n) {
val s = next().chunked(1)
for (j in 0 until m) {
board[i][j] = s[j]
}
}
val index = board[0][0].toCharArray()[0].toInt() - 65
check[index] = 1
move(0, 0, 1)
println(max_value)
}
fun move(x: Int, y: Int, cnt: Int) {
max_value = max(max_value, cnt)
for (i in 0 until 4) {
val nx = x + dx[i]
val ny = y + dy[i]
if (nx in 0 until n && ny in 0 until m) {
val index = board[nx][ny].toCharArray()[0].toInt() - 65
if (check[index] == 0) {
check[index] = 1
move(nx, ny, cnt + 1)
check[index] = 0
}
}
}
}
ํ์ด ๋ฐฉ๋ฒ
๋น๊ต์ ๊ฐ๋จํ ๋ฐฑํธ๋ํน
๋ฌธ์ ์ด๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ํ๋ฒณ
์ผ ๊ฒฝ์ฐ์ DFS
๋ฅผ ์งํํ๋ฉด ๋๋ค. ๋ฌธ์ ๋ฅผ ์ฒ์ ์ ํ์ ๋๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ 2์ฐจ์ ๋ฐฐ์ด๊ณผ ๋ฐฉ๋ฌธํ ์ํ๋ฒณ์ ์ ์ฅํ๋ ์ผ์ฐจ์ ๋ฐฐ์ด์ ๊ฐ๊ฐ ์ ์ธํด์ ์งํํ์๋ค. ์๋ก ๋ฐฉ๋ฌธํ๋ ์ขํ๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ๋ฒณ์ผ ์๋ ์์ด์ ์ด๋ ๊ฒ ๋ฐ๋ก ์ ์ธํ์๋ค. ํ์ง๋ง ์ด๋ด ํ์๊ฐ ์์๋ค. ๋ฐฉ๋ฌธํ ์ํ๋ฒณ์ ์ ์ฅํ๋ ์ผ์ฐจ์ ๋ฐฐ์ด๋ง ์์ด๋ ์ถฉ๋ถํ๋ค. ์ด์ ๋ ๊ฐ๋จํ๋ค.
- ํ์ฌ (2,2)๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ด๊ณณ์ ์ํ๋ฒณ์ K์ด๋ค. ์ผ์ฐจ์ ๋ฐฐ์ด์ K์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋ค.
- (-1, 0)์ ์ด๋ํด์ (1, 2) ๋ฅผ ๋ฐฉ๋ฌธํ๋ ค๊ณ ํ๋ค. ์ด๊ณณ์ ์ํ๋ฒณ์ D์ด๋ฏ๋ก ๋ฐฉ๋ฌธํ๋ค.
- ์, ํ, ์ข, ์ฐ๋ฅผ ๋ชจ๋ ์ด๋ํ๋ฏ๋ก (1, 0) ์ ์ด๋ํ๋ฉด ๋ค์ (2, 2) ๋ฅผ ๋ฐฉ๋ฌธํ๋ค. ํ์ง๋ง K๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ํ๋ฒณ์ด๋ฏ๋ก ๋ฐ๋ผ์ ๋ฐฉ๋ฌธํ์ง ์๋๋ค.
์ด์ฒ๋ผ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ผ์ฐจ์ ๋ฐฐ์ด๋ง ์ ์ธํด๋ ์ถฉ๋ถํ๋ค.
1. ์ ๋ ฅ ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅ
for (i in 0 until n) {
val s = next().chunked(1)
for (j in 0 until m) {
board[i][j] = s[j]
}
}
2. (0,0) ์ ๋ฐฉ๋ฌธํ๊ณ DFS ๋ฅผ ์งํ
val index = board[0][0].toCharArray()[0].toInt() - 65
check[index] = 1
move(0, 0, 1)
3. ์, ํ, ์ข, ์ฐ ๋ฅผ ํ์ํ๋ฉฐ ๋ฐฉ๋ฌธํ์ง ์์ ์ํ๋ฒณ์ผ ๊ฒฝ์ฐ DFS ๋ฅผ ์งํ
fun move(x: Int, y: Int, cnt: Int) {
max_value = max(max_value, cnt)
for (i in 0 until 4) {
val nx = x + dx[i]
val ny = y + dy[i]
if (nx in 0 until n && ny in 0 until m) {
val index = board[nx][ny].toCharArray()[0].toInt() - 65
if (check[index] == 0) {
check[index] = 1
move(nx, ny, cnt + 1)
check[index] = 0
}
}
}
}
๊ฒฐ๊ณผ
'โ๏ธ ์ฝํ ์ค๋น > Back Tracking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑํธ๋ํน / Kotlin] BOJ 14889 - ์คํํธ์ ๋งํฌ (0) | 2022.04.10 |
---|---|
[๋ฐฑํธ๋ํน / Kotlin] BOJ 1759 - ์ํธ ๋ง๋ค๊ธฐ (0) | 2022.04.10 |
[๋ฐฑํธ๋ํน / Kotlin] BOJ 14888 - ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (0) | 2022.03.31 |
[๋ฐฑํธ๋ํน / Kotlin] BOJ 2580 - ์ค๋์ฟ (0) | 2022.03.30 |
[๋ฐฑํธ๋ํน / Kotlin] BOJ 9663 - N Queen (0) | 2022.03.29 |