https://www.acmicpc.net/problem/15652
15652번: N과 M (4)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
[난이도] Silver3
[유형] 백트래킹
[풀이]
이전 포스팅의 "N과 M (2)" 문제와 비슷하게 접근하면 되지만 다른 점이 같은 수를 여러번 선택할 수 있다는 점입니다.
재귀함수 내 n을 선택했을때의 호출 부분을 아래와 같이 변경해주면 됩니다.
used[n]++
sol(n,k+1)
used[n]--
n을 또 선택할 수 있으므로 n을 그대로 인자로 넘기고, used를 true false가 아닌 n이 몇개 쓰였는지를 체크하기 위해
호출시 used[n]++을 해주고 리턴시 used[n]--를 해줍니다.
수열을 출력시에는 used[n]의 값만큼 n을 출력해주면 됩니다.
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
var N=0
var M=0
var used = Array<Int>(9){0}
fun sol(n:Int,k:Int){
if(k==M){
for(i in 1..N){
repeat(used[i]){
print("$i ")
}
}
println()
return;
}
if(n>N) return;
used[n]++
sol(n,k+1)
used[n]--
sol(n+1,k)
}
fun main() = with(BufferedReader(InputStreamReader(System.`in`))){
var ip = readLine().split(' ').map{it.toInt()}
N=ip[0]
M=ip[1]
sol(1,0)
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Silver3/15652.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Silver2] 2407 : 조합 (Kotlin) (0) | 2021.08.15 |
---|---|
[BOJ/백준][Silver1] 1991 : 트리 순회 (Kotlin) (0) | 2021.08.15 |
[BOJ/백준][Silver3] 15650 : N과 M (2) (Kotlin) (0) | 2021.08.06 |
[BOJ/백준][Silver2] 11279 : 최대 힙 (Kotlin) (0) | 2021.08.06 |
[BOJ/백준][Silver2] 18870 : 좌표 압축 (C++) (0) | 2021.07.25 |