728x90
https://www.acmicpc.net/problem/14225
14225번: 부분수열의 합
수열 S가 주어졌을 때, 수열 S의 부분 수열의 합으로 나올 수 없는 가장 작은 자연수를 구하는 프로그램을 작성하시오. 예를 들어, S = [5, 1, 2]인 경우에 1, 2, 3(=1+2), 5, 6(=1+5), 7(=2+5), 8(=1+2+5)을 만들
www.acmicpc.net
문제 풀이
1. 부분수열을 구하기 위한 DFS 탐색을 수행한다.
2. DFS 수행 시 depth 를 1 부터 N 까지 설정하여 부분 수열을 구한다.
3. result list 를 최대의 크기인 2,000,001 크기로 설정하고 초기 값을 1로 한다.
4. 부분 수열의 합을 result index 로 넣고 value 를 0으로 설정한다.
5. result list 에서 value 가 0이 될 때 index 를 출력한다.
코드
import java.io.*
private val result = IntArray(2000001) { 1 } // 부분 수열로 나올 경우 해당 되는 index 를 0으로 업데이트 한다.
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val S = br.readLine().split(" ").map { it.toInt() }.toIntArray()
for (i in 1..N) {
val visit = BooleanArray(N) { false }
dfs(N, S, visit, 0, 0, i)
}
for (i in 1..2000000) {
if (result[i] != 0) {
println(i)
break
}
}
}
private fun dfs(N: Int, S: IntArray, visit: BooleanArray, start: Int, depth: Int, target: Int) {
if (depth == target) {
var ret = 0
S.forEachIndexed { index, s ->
if (visit[index]) ret += s
}
result[ret] = 0
return
}
for (i in start until N) {
if (visit[i]) continue
visit[i] = true
dfs(N, S, visit, i, depth + 1, target)
visit[i] = false
}
}
728x90
'알고리즘(w.KOTLIN) > 탐색' 카테고리의 다른 글
[백준][코틀린][12100] 2048 (0) | 2023.03.14 |
---|---|
[백준][코틀린][1062] 가르침 (0) | 2023.03.10 |
[백준][코틀린][1987] 알파벳 (0) | 2023.03.09 |
[백준][코틀린][9663] N-Queen (0) | 2023.03.07 |
[백준][코틀린][15658] 연산자 끼워넣기(2) (0) | 2023.03.03 |