문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 길이가 최대 50인 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다.
출력
첫째 줄에 정답을 출력한다.
풀이
이 문제는 숫자의 더하기 식에서 괄호를 이용하여 최소값을 구하는 문제이다.
최소값을 구하기 위한 괄호는 빼기 연산이 나왔을 때 그 뒤를 모두 괄호로 묶어서 빼기로 만들어야 한다.
예)
5+10-5+7-8-9+10
5+10-(5+7)-8-(9+10)
결국 맨 처음 빼기 연산자가 나온 이후의 값들은 빼주면 된다.
소스 코드 (go)
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
input := scanner.Text()
result := 0
tmp := 0
plusOperator := true
for _, s := range input {
if i, err := strconv.Atoi(string(s)); err == nil {
tmp = tmp * 10 + i
continue
}
if plusOperator {
result += tmp;
} else {
result -= tmp;
}
tmp = 0
// 맨 처음 -가 나온 시점. 이후 들어오는 값은 모두 뺀다
if plusOperator == true && s == '-' {
plusOperator = false
}
}
if plusOperator {
result += tmp;
} else {
result -= tmp;
}
fmt.Print(result)
}
문제 출처 : www.acmicpc.net/problem/1541
반응형
'공부 > 알고리즘' 카테고리의 다른 글
[백준] 7568번 덩치 (0) | 2020.11.30 |
---|---|
[백준] 2231번 분해합 (0) | 2020.11.29 |
[백준] 11399번 ATM (0) | 2020.11.26 |
[백준] 1931번 회의실배정 (0) | 2020.11.24 |
[백준] 11047번 동전 0 (0) | 2020.11.23 |