https://www.acmicpc.net/problem/1182
https://www.acmicpc.net/problem/9663
https://www.acmicpc.net/problem/15649
백트래킹의 연습을 위해서 문제를 풀었습니다. 가장 중요한 구조는 N과 M(1) 의 문제를 기초로 문제에서 원하는 조건 과 분기를 설정하여 백트래킹을 하는 것입니다.
fun main(){
val (n,m) = readLine()!!.split(" ").map{it.toInt()}
val num = IntArray(m) {0}
val used = BooleanArray(n+1) {false}
fun bt(par : Int){
if(m==par) {
println(num.joinToString(" "))
return
}
for(i in 1..n){
if(!used[i]){
num[par] = i
used[i]= true
bt(par+1)
used[i]=false
}
}
}
bt(0)
}
n을 사용되는 숫자의 범위 m을 출력될 자리수로 생각하면 bt함수의 첫번째에서는 우선 자리수(m)만큼 bt함수가 재귀 되었는가를 판단하고 만약 그만큼 재귀되었다면 채워진 num IntArray를 출력하는 것입니다.
이후 for문에서는 used라는 BoolenArray를 통해서 해당 숫자가 사용되었는가 아닌가를 판단하면서 사용되지 않았다면 해당 숫자를 num에 채우고 다음 숫자를 매개변수로 재귀 호출 합니다.
이와 같은 구조를 기초로 N-Queen, 부분수열의 합등의 문제를 풀었습니다.
이외 풀이 코드는 https://github.com/IslandofDream/Baekjoon_Practice/tree/main/%EB%B0%B1%EC%A4%80 를 참고해주시면 감사하겠습니다.
참고링크
https://youngest-programming.tistory.com/221