728x90
https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net
문제 풀이
1. 입력으로 주어지는 연산자를 개수를 포함하여 op 배열에 저장한다.
2. 저장된 op 배열의 모든 경우의 수를 확인하는 DFS 탐색을 수행한다.
3. 최대/최소 값을 출력한다.
코드
import java.io.*
private var max = Int.MIN_VALUE
private var min = Int.MAX_VALUE
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val number = br.readLine().split(" ").map { it.toInt() }.toIntArray()
val op = mutableListOf<String>()
br.readLine().split(" ").map { it.toInt() }.forEachIndexed { index, count ->
for (i in 0 until count) {
op.add(getOperator(index))
}
}
//println("$op")
val visit = BooleanArray(op.size) { false }
val resultOp = mutableListOf<String>()
dfs(N, number, op, visit, 0, resultOp)
println(max)
println(min)
}
private fun dfs(N: Int, number: IntArray, op: MutableList<String>, visit: BooleanArray, depth: Int, result: MutableList<String>) {
if (depth == N - 1) {
// 최대, 최소 저장하기
//println("result : $result")
var sum = number[0]
for (i in 0 until result.size) {
when (result[i]) {
"+" -> sum += number[i + 1]
"-" -> sum -= number[i + 1]
"*" -> sum *= number[i + 1]
"/" -> sum /= number[i + 1]
}
}
min = Math.min(min, sum)
max = Math.max(max, sum)
return
}
for (i in 0 until op.size) {
if (visit[i]) continue
visit[i] = true
result.add(op[i])
dfs(N, number, op, visit, depth + 1, result)
result.removeLast()
visit[i] = false
}
}
private fun getOperator(index: Int): String {
return when (index) {
0 -> "+"
1 -> "-"
2 -> "*"
else -> "/"
}
}
728x90
'알고리즘(w.KOTLIN) > 재귀' 카테고리의 다른 글
[백준][코틀린][2580] 스도쿠 (0) | 2023.03.08 |
---|---|
[백준][코틀린][16198] 에너지 모으기 (0) | 2023.03.03 |
[알고리즘][KOTLIN] 숫자 카드 나누기 (0) | 2022.12.02 |