반응형

백준 1541번 문제입니다. (solved.ac) 기준 실버 2 문제입니다.

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

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

문제

문제 접근

+, -, 0 ~ 9 로만 이루어진 수식이 주어지고 이 수식의 값이 최소가 되도록 적당히 괄호를 사용하여 수식의 최솟값을 출력하면 됩니다.
처음에 문제를 잘못이해하여 괄호를 하나만 사용가능하다고 생각하여 복잡한 방식으로 접근을 하였지만, 괄호를 여러 개를 사용할 수 있다는 것을 알고 비교적 쉽게 해결하였습니다.

주어진 수식이 최솟값이 되기 위해선 처음 -가 나온 이후의 모든 값들을 빼도록 괄호를 만들면 됩니다.
ex) 50-55+40-(20+10)와 같은 식이 주어진다면 50-(55+40)-(20+10)으로 괄호를 만들 수 있습니다.

즉, 간단히 생각하여 괄호를 구현하는 것이 아니라 주어진 주식에서 처음 -가 나온 이후의 모든 수들을 빼도록 계산하면 됩니다.

이를 이용하여 연산자들의 위치, 처음 나온 -연산자의 위치를 이용하여 입력받아진 수식을 파싱하고 계산하도록 구현하였습니다.

정답 코드

fun main(){

    // 수식을 입력 받음. - 뒤의 수를 최대로 만들어라.
    val expression = readln()
    // '-' 의 위치
    var minusLoation = -1
    // 연산자들의 위치
    val whereIsOperator = mutableListOf<Int>()
    // 계산이 되어질 수(정답 값)
    var num = 0

    expression.forEachIndexed{index, it ->

        // '-' 의 위치
        if (it == '-') {
            if (minusLoation == -1) minusLoation = index
            whereIsOperator.add(index)
        }
        // '+'의 위치
        if (it == '+') {
            whereIsOperator.add(index)
        }

    }

    // 문자열 파싱된 마지막 인덱스
    var lastIndex = 0
    // 연산자를 분리한 순수 숫자
    var dividedNum = 0

    // 연산자와 숫자들을 분리하는 작업
    whereIsOperator.forEach {  indexForOperator ->

        dividedNum = expression.substring(lastIndex,indexForOperator).toInt()
        lastIndex = indexForOperator+1

        // - 이후의 숫자들은 전부 -로 처리
        if (indexForOperator <= minusLoation || minusLoation == -1){
            num += dividedNum
        } else {
            num -= dividedNum
        }
    }

    // 마지막 연산자뒤에 숫자가 담겨야함.
    dividedNum = expression.substring(lastIndex,expression.length).toInt()
    if (minusLoation == -1){
        num += dividedNum
    } else {
        num -= dividedNum
    }

    println(num)

}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기