공부/알고리즘

[백준] 1541번 잃어버린 괄호

2020. 11. 28. 19:40

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 길이가 최대 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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

반응형

'공부 > 알고리즘' 카테고리의 다른 글

[백준] 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