Developing Myself Everyday
 

16637번: 괄호 추가하기

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가

www.acmicpc.net

문제

길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순서대로 계산해야 한다. 예를 들어, 3+8×7-9×2의 결과는 136이다.

수식에 괄호를 추가하면, 괄호 안에 들어있는 식은 먼저 계산해야 한다. 단, 괄호 안에는 연산자가 하나만 들어 있어야 한다. 예를 들어, 3+8×7-9×2에 괄호를 3+(8×7)-(9×2)와 같이 추가했으면, 식의 결과는 41이 된다. 하지만, 중첩된 괄호는 사용할 수 없다. 즉, 3+((8×7)-9)×2, 3+((8×7)-(9×2))은 모두 괄호 안에 괄호가 있기 때문에, 올바른 식이 아니다.

수식이 주어졌을 때, 괄호를 적절히 추가해 만들 수 있는 식의 결과의 최댓값을 구하는 프로그램을 작성하시오. 추가하는 괄호 개수의 제한은 없으며, 추가하지 않아도 된다.

입력

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가 번갈아가면서 나온다. 연산자는 +, -, * 중 하나이다. 여기서 *는 곱하기 연산을 나타내는 × 연산이다. 항상 올바른 수식만 주어지기 때문에, N은 홀수이다.

출력

첫째 줄에 괄호를 적절히 추가해서 얻을 수 있는 결과의 최댓값을 출력한다. 정답은 231보다 작고, -231보다 크다.

 

 

나의 풀이

이 문제를 접했을 때 문제를 제대로 읽지 않아서 중첩된 괄호를 사용하지 않아야 하는 것을 몰랐다. 그래서 많이 돌아갔지만 해결하였다. 이 문제는 재귀함수를 사용해서 가능한 곳에 괄호를 전부 넣어서 해결해야 한다.

괄호를 넣는다는 개념은 해당하는 연산자를 먼저 계산한다는 의미이다. 그러므로 반복문으로 모든 연산자로 재귀함수를 시작하게 해 주었다.

 

다만 중첩된 괄호를 사용하지 않아야 한다. 이를 해결하기 위해 각 자리를 Pair로 두고 해당하는 연산자를 수행한 다음 숫자를 true로 바꿔서 해당하는 숫자로는 더 이상 연산을 하지 않게 해 주었다.

 

생각보다 너무 복잡하게 해결했기에 더 나은 방법이 있을것 같다.

 

import kotlin.math.max

fun main() = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val formula = readLine().toCharArray().map { Pair(it.toString(), false) }

    if (n == 1) {
        println(formula.first().first)
        return@with
    }

    if (n == 3) {
        println(cal(1, formula).first().first)
        return@with
    }

    recur(formula, n)
    println(ans)

}
var ans = Int.MIN_VALUE
fun recur(formula: List<Pair<String, Boolean>>, n: Int) {
    for (i in 1 until formula.size step 2) {
        if (formula[i - 1].second || formula[i + 1].second) {
            var temp = formula

            while (temp.size != 1) {
                temp = cal(1, temp)
            }

            ans = max(ans, temp.map { it.first }.joinToString("").toInt())
            continue
        }

        recur(cal(i, formula), n)
    }
}

fun cal(i: Int, formula: List<Pair<String, Boolean>>): List<Pair<String, Boolean>> {
    val a = formula[i - 1].first.toString().toInt()
    val b = formula[i + 1].first.toString().toInt()
    val oper = formula[i].first

    val temp = when (oper) {
        "+" -> a + b
        "-" -> a - b
        "*" -> a * b
        else -> a / b
    }

    val newFormula = mutableListOf<Pair<String, Boolean>>()

    for (j in 0 until i - 1) {
        newFormula.add(formula[j])
    }

    newFormula.add(Pair(temp.toString(), true))

    for (j in i + 2 until formula.size) {
        newFormula.add(formula[j])
    }

    return newFormula
}

 

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!