본문 바로가기

알고리즘(w.KOTLIN)/탐색

[백준][코틀린][15658] 연산자 끼워넣기(2)

728x90

https://www.acmicpc.net/problem/15658

 

15658번: 연산자 끼워넣기 (2)

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1보다 크거나 같고, 4N보다 작거나 같은 4개의 정수가 주어지는데, 차례대

www.acmicpc.net

문제 풀이

1. 주어진 입력을 number 배열과 operator 배열에 저장한다.

2. operator 배열의 정보를 완전 탐색하는 DFS 를 수행한다.

3. 연산 결과를 구하는 것이기 때문에 DFS 수행 시 첫번째 num 값을 채워서 수행한다.

코드

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 operator = br.readLine().split(" ").map { it.toInt() }.toIntArray()

    dfs(N, number, operator, 1, number[0])
    println(max)
    println(min)
}

private fun dfs(N: Int, number: IntArray, operator: IntArray, depth: Int, sum: Int) {
    if (depth == N) {
        min = Math.min(min, sum)
        max = Math.max(max, sum)
        return
    }

    for (i in 0..3) {
        if (operator[i] > 0) {
            operator[i] -= 1
            //println("operator[$i]:${operator[i]}, sum:$sum")
            when (i) {
                0 -> dfs(N, number, operator, depth + 1, sum + number[depth])
                1 -> dfs(N, number, operator, depth + 1, sum - number[depth])
                2 -> dfs(N, number, operator, depth + 1, sum * number[depth])
                3 -> dfs(N, number, operator, depth + 1, sum / number[depth])
            }

            operator[i] += 1
        }
    }
}
728x90