[BOJ/Python] #1541번: 잃어버린 괄호

2022. 7. 29. 12:580️⃣ Algorithm&자료구조/BOJ

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

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

 

 

 

문제

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

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

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

 

입력

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

 

출력

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

 

예제 입력 1

55-50+40

예제 출력 1

-35

 

 

풀이

일단 문제를 잘 이해해야 한다. 30+45-60 을 계산해야 한다고 하자. 이때 최소를 만들기 위해

30+4(5-60) 처럼 생각할 수 있지만, 문제는 그것을 허용하지 않는다. 무조건 덧셈, 뺄셈 범위에서 식을 전개해야 한다.

 

자, 그렇다면 사실 간단해진다. 뺄셈 앞에 괄호를 치면 된다. 30+40+50-60+70-90+100-20 이 주어졌다. 뺄셈 연산자가 한 번만 오면, 그 뒤의 숫자는 모두 빼도 무방하다.

뺄셈 연산자가 나오면, 그 뒤의 모든 수는 뺀다.

 

위의 규칙을 성실히 수행하는 코드를 짜면 통과할 수 있다.

 

import sys
import re

# 케이스 입력받기
s = sys.stdin.readline().rstrip()

s_list = list(map(int, re.findall(r"[\w']+", s)))
operator = [i for i in s if i in ['+', "-"]]

# 첫 번째 값 처리
result = s_list[0]
s_list = s_list[1:]

game = True
while game == True:
    for i in range(len(s_list)):
        if operator[i] == '-':
            s_list = s_list[i:]
            result -= sum(s_list)
            break
        else:
            result += s_list[i]
    game = False
    
sys.stdout.write(str(result)+'\n')