티스토리 뷰

 

일단 숫자(numbers)와 연산자(operators)를 구분해주었다.

보통 구분자를 기준으로 나눌 때 split 함수를 사용하는데, 여기서는 +, - 두 가지로 구분을 해야하기 때문에 

import re 를 통해 여러 개 구분자로 split 해주었다. 

아래 코드와 같이 numbers = re.split('[+-]', S) 으로 써주었다. 

split 기준이 될 기호를 '[ ]' 안에 넣는 형식으로 사용한다.

 

문제 풀이 아이디어

최솟값이 나와야 하므로 +와 -가 있을 때 최대한 -로 계산되게 하는 것이 문제의 핵심이었다.

previous에 이전 연산자를 넣고, now에 현재 계산할 연산자를 넣은 다음, 둘을 비교하여 현재 숫자를 더할지 뺄지 결정하였다.

 

(1) previous = +, now = +

그대로 + 로 계산해준다. 괄호가 필요 없다. 

previous와 now가 같으므로 업데이트가 필요없다.

 

(2) previous = +, now = -

-로 계산한 뒤, previous는 -로 업데이트한다. 

 

(3) previous = -, now = +

-로 계산한 뒤, previous는 그대로 -로 유지한다.

1-2+3 이 주어졌을 때, 1-(2+3) 이 최솟값이다. 즉 1에서 2도 빼고 3도 빼야 한다. 

괄호가 생기므로 previous는 -로 유지한다.

 

(4) previous = -, now = -

-로 계산한 뒤, previous와 now가 같으므로 그대로 -로 유지한다.

1-2-3 이 주어졌을 때, 괄호 없이 모두 - 로 계산하는 것이 최솟값이다. 

 

import re
S = input()
numbers = []
operators = []

numbers = re.split('[+-]', S)
for s in S:
    if s == '+' or s == '-':
        operators.append(s)


answer = int(numbers[0])
previous = '+'
for i in range(len(operators)):
    now = operators[i]
    if previous == '+':
        if now == '+':
            answer += int(numbers[i+1])
        else:
            answer -= int(numbers[i+1])
            previous = '-'
    else:
            answer -= int(numbers[i+1])
print(answer)

 

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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net