/* 본 게시물은 참고자료를 토대로 작성되었습니다. */
/* 본 글은 개인적으로 공부한 내용을 정리한 글이므로 오류가 있을 수 있습니다. */
참고 자료
[백준] 1541번 - 잃어버린 괄호: https://www.acmicpc.net/problem/1541
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
1. MySolution (136ms)
fun main() {
val numList = ArrayList<String>(50)
var num = ""
var minusGroup = ArrayList<Int>()
var plusGroup = ArrayList<Int>()
// 숫자와 + - 로 나눔
readLine()!!.forEach{
if (it == '+' || it == '-') {
numList.add(num)
num = ""
numList.add(it.toString())
}
else num += it.toString()
}
numList.add(num) // 마지막 숫자 추가
/**
* 숫자 분류
* 아직 minus 가 안 나왔으면 status = 0 (plusGroup) 아니면 status = 1 (minusGroup)
*/
var tmp = 0 // 숫자 합을 담을 임시 변수
var status = 0 // 0 is plus 1 is minus
for (num in numList){
when {
num == "-" -> if (status == 1) {
minusGroup.add(tmp)
tmp = 0
} else {
plusGroup.add(tmp)
status = 1
tmp = 0
}
num == "+" -> continue
else -> tmp += num.toInt()
}
}
if (status == 0) plusGroup.add(tmp) else minusGroup.add(tmp) // 마지막 숫자 처리
//Ans
print(plusGroup.sum() - minusGroup.sum())
}
2. BestSolution
2-1. 개선한 코드
fun bestSol() {
val expression = readLine()!!
var total = 0
var num = 0
var isSum = true // status
for (c in expression) {
if (c == '-' || c == '+') {
total += if (isSum) num else -num
if (isSum) isSum = c == '+'
num = 0 // num 초기화
}
else {
num = num * 10 + (c - '0') // 자리수 처리
}
}
total += if (isSum) num else -num // 마지막 숫자 처리
print(total)
}
* 숫자를 String형 으로 처리해서 Int형으로 변환한 내 방법에 비해 코드도 짧고 효율적이다.
2-2. shortSolution
fun main() = with(System.`in`.bufferedReader()) {
val str = readLine().split("-")
var min = str[0].split("+").sumOf { it.toInt() }
for (i in 1 until str.size) {
min -= str[i].split("+").sumOf { it.toInt() }
}
println(min)
}
split()을 사용하면 간단하게 더할 숫자와 뺄 숫자를 구별할 수 있다.