반응형
백준 1541번 문제입니다. (solved.ac) 기준 실버 2 문제입니다.
https://www.acmicpc.net/problem/1541
문제
문제 접근
+, -, 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)
}
반응형
'알고리즘 문제풀이[Algorithm]' 카테고리의 다른 글
[백준] 1316번 그룹 단어 체커[Kotlin - 코틀린] (0) | 2022.06.28 |
---|---|
[백준] 4949번 균형잡힌 세상(Stack - 스택)[Kotlin - 코틀린] (0) | 2022.06.25 |
[백준] 1946번 신입 사원(그리디)[Kotlin - 코틀린] (0) | 2022.06.24 |
[백준] 1009번 분산처리[Kotlin - 코틀린] (0) | 2022.06.22 |
[백준] 10815번 숫자 카드(집합 - mutableSet)[Kotlin - 코틀린] (0) | 2022.06.22 |
최근댓글