N๊ณผ M (1)
๋ฌธ์
ํ์ด ์ธ์ด
Kotlin
์ฝ๋
import java.util.*
lateinit var visit: Array<Int>
lateinit var input: Array<Int>
var n: Int = 0
var m: Int = 0
fun main() = with(Scanner(System.`in`)) {
n = nextInt()
m = nextInt()
visit = Array(n + 1) { 0 }
input = Array(n + 1) { 0 }
dfs(0)
}
fun dfs(depth: Int) {
if (depth == m) {
for (i in 0 until m) {
print("${input[i]} ")
}
println()
return
}
for (i in 0 until n) {
if (visit[i] == 0) {
visit[i] = 1
input[depth] = i + 1
dfs(depth + 1)
visit[i] = 0
}
}
return
}
ํ์ด ๋ฐฉ๋ฒ
์ด ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน
์ ํ์ฉํ๋ ๋ฌธ์ ์ด๋ค. ๋ฐฑํธ๋ํน์ ์์ ํ์ ๊ธฐ๋ฒ ์ค์ ํ๋๋ก DFS (Depth First Search)
์์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ์ ์๋ ๋ฐฐ์ ํ์ฌ(๊ฐ์ง์น๊ธฐ) ํ์ ์๋๋ฅผ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฐ์ ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง n
๊ณผ m
์ ๋ํด ์์๋ณด์. n์ ํ์์ด ์งํ๋๋ ์ฒซ ๋ฒ์งธ ์ซ์, m์ ํ์ ๊น์ด
๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ง์ ์ Pass
ํ๊ณ ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ ์ผ ๋ ๋ ๋์ Depth
์์ ํ์์ ์งํํ๋ค. ์ด ๋ m
๊ณผ ๊ฐ์ depth ์ ์ง์
ํ ๊ฒฝ์ฐ input
์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๊ฐ๋ น 4, 4 ๊ฐ ์ฃผ์ด์ก๋ค๊ณ ๊ฐ์ ํ๋ฉด ์๋์ ๊ฐ์ด ํ์์ ์งํํ๋ค.
1
11(pass)
12
122(pass)
123
1233(pass)
1234
...
๊ฒฐ๊ณผ
N๊ณผ M (2)
๋ฌธ์
ํ์ด ์ธ์ด
Kotiln
์ฝ๋
import java.util.*
lateinit var visit: Array<Int>
lateinit var input: Array<Int>
var n: Int = 0
var m: Int = 0
fun main() = with(Scanner(System.`in`)) {
n = nextInt()
m = nextInt()
visit = Array(n + 1) { 0 }
input = Array(n + 1) { 0 }
dfs(0, 0)
}
fun dfs(depth: Int, before : Int) {
if (depth == m) {
for (i in 0 until m) {
print("${input[i]} ")
}
println()
return
}
for (i in 0 until n) {
if (visit[i] == 0 && before < i + 1) {
visit[i] = 1
input[depth] = i + 1
dfs(depth + 1, i + 1)
visit[i] = 0
}
}
return
}
ํ์ด ๋ฐฉ๋ฒ
์ด์ ๋ฌธ์ ์ ๋์ผํ์ง๋ง ํ ๊ฐ์ง ์กฐ๊ฑด์ด ์ถ๊ฐ๋์๋ค. ์์ด์ด ์ค๋ฆ์ฐจ์
์ด์ด์ผ ํ๋ค. ์ด์ ์ ๋ฐฉ๋ฌธํ ์ง์ ๊ณผ ํ์ฌ ๋ฐฉ๋ฌธํ ์ง์ ์ ๋น๊ตํด์ ํ์ฌ ๋ฐฉ๋ฌธํ ์ง์ ์ด ๋ ํฐ ๊ฒฝ์ฐ์๋ง ๋ ๋์ Depth
์์ ํ์์ ์งํํ๋๋ก ํ๋ค.
๊ฒฐ๊ณผ
N๊ณผ M (3)
๋ฌธ์
ํ์ด ์ธ์ด
kotlin
์ฝ๋
import java.util.*
lateinit var visit: Array<Int>
lateinit var input: Array<Int>
var n: Int = 0
var m: Int = 0
var stringBuilder = StringBuilder()
fun main() = with(Scanner(System.`in`)) {
n = nextInt()
m = nextInt()
visit = Array(n + 1) { 0 }
input = Array(n + 1) { 0 }
dfs(0)
println(stringBuilder)
}
fun dfs(depth: Int) {
if (depth == m) {
for (i in 0 until m) {
stringBuilder.append(input[i]).append(" ")
}
stringBuilder.append("\n")
return
}
for (i in 0 until n) {
input[depth] = i + 1
dfs(depth + 1)
}
return
}
ํ์ด ๋ฐฉ๋ฒ
์ด์ ๋ ๋ฌธ์ ์ ๋ค๋ฅด๊ฒ ์ด๋ฒ์ ์ค๋ณต
์ ํ์ฉ
ํ๋ค. ๊ฒฝ์ฐ์ ์๊ฐ ํจ์ฌ ์ปค์ก๋ค. ๊ทธ๋์ ๋จ์ํ print
๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ ์ด๊ณผ
๊ฐ ๋ฐ์ํ๋ค. ์ถ๋ ฅ์ ๋ํ ์๊ฐ์ ์ค์ด๊ณ ์ StringBuilder
๋ฅผ ์ฌ์ฉํ๋ค.
๊ฒฐ๊ณผ
N๊ณผ M (4)
๋ฌธ์
ํ์ด ์ธ์ด
Kotlin
์ฝ๋
import java.util.*
lateinit var visit: Array<Int>
lateinit var input: Array<Int>
var n: Int = 0
var m: Int = 0
var stringBuilder = StringBuilder()
fun main() = with(Scanner(System.`in`)) {
n = nextInt()
m = nextInt()
visit = Array(n + 1) { 0 }
input = Array(n + 1) { 0 }
dfs(0, 0)
println(stringBuilder)
}
fun dfs(depth: Int, before : Int) {
if (depth == m) {
for (i in 0 until m) {
stringBuilder.append(input[i]).append(" ")
}
stringBuilder.append("\n")
return
}
for (i in 0 until n) {
if (before > i + 1) continue
input[depth] = i + 1
dfs(depth + 1, i + 1)
}
return
}
ํ์ด ๋ฐฉ๋ฒ
์ด๋ฒ์ ์ค๋ณต
๊ณผ ์ค๋ฆ์ฐจ์
์ ๋ชจ๋ ๊ณ ๋ คํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค. ์ญ์ StringBuilder
๋ฅผ ์ฌ์ฉํด์ ์ถ๋ ฅ ์๊ฐ์ ์ค์ธ๋ค.
๊ฒฐ๊ณผ
'โ๏ธ ์ฝํ ์ค๋น > 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 9663 - N Queen (0) | 2022.03.29 |