Post

[BOJ] 잃어버린 괄호 - 1541 (S2)

[BOJ] 잃어버린 괄호 - 1541 (S2)
시간 제한메모리 제한
2초128 MB

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 정답을 출력한다.

풀이

입력되는 부호는 ‘+’, ‘-’ 뿐이기 때문에, 최소를 만들 수 있는 방법은 간단하게 구할 수 있다.

‘-’가 등장하지 않으면 무조건 더할 수 밖에 없다.

하지만 ‘-’가 등장하는 순간부터는 괄호를 이용하여 무조건 후에 나오는 수를 뺄셈으로 만들 수 있다.

예를 들면 55-50+40+90-100+10-11 이라는 수식이 입력됐을 때 55-(50+40+90)-(100+10)-11 = 55-50-40-90-100-10-11 로 만들 수 있다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
st = input().strip()+ '+'
total = 0
minus = False
num = ''
for c in st:
    if c.isdigit():
        num += c
    else:
        if minus:
            total -= int(num)
        else:
            total += int(num)
        if c == '-':
            minus = True
            
        num = ''
print(total)

입력은 숫자와 부호가 섞인 문자열로 주어지기 때문에 그 문자열을 확인하면서 문자가 숫자인지 부호인지에 때라 다르게 처리를 해주어야 한다.

  1. 숫자

    부호가 들어오기 전까지 하나의 숫자이기 때문에 문자열로 계속 이어준다.

  2. +

    만약 ‘-’ 부호가 한 번도 나오지 않았다면 더할 수 밖에 없으므로 결과가 저장될 total에 정수로 이전까지 만들어 놓은 문자열을 정수로 바꿔 더한다.

  3. -

    ‘-’가 등장한 순간부터는 무조건 빼면 되기 때문에 minus 변수를 True로 바꿔준다.

    이후의 연산은 minusTrue이기 때문에 이전까지 만들어 놓은 문자열을 정수로 바꿔 뺀다.

This post is licensed under CC BY 4.0 by the author.