알고리즘 연습/그리디 알고리즘

[🥈2 / 백준 1541 / 파이썬] 잃어버린 괄호

김세진 2021. 6. 20. 22:02
반응형

 

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

 

문제

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

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

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

입력

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

출력

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

 

예제 입력 

55-50+40

예제 출력 

-35

 

풀이

 

주어진 식에 괄호를 넣어 최솟값을 만드는 문제이다.

 

괄호를 어디에 넣어야 할지부터 생각해 보자.

 

식에 쓰이는 연산이 오직 +, - 뿐이므로

 

당연 서로 더하는 것에만 괄호를 넣으면 모두 빼는 값이 될 것이다.

 

이 말인 즉, 처음 숫자만 더하고 나머지 뒤에 오는 숫자는 모두 빼면 된다는 말이다.

 

이를 바탕으로 eval을 이용하여 코드를 짰다.

 

a = list(input().split("-"))
for i in range(len(a)):
    a[i] = eval(a[i])
result = a[0]*2
for i in a:
    result -= i
print(result)

 

예제의 입력은 답이 잘 나왔으나, syntax error가 발생한다.

 

수는 0으로 시작할 수 있다는 조건 때문에

 

eval에 002 와 같은 값이 들어갈 경우 에러가 발생하는 것이었다.

 

따라서 int() 를 이용하여 형변환을 해 줄 필요가 있다.

 

여기서 첫 번째 수 이후 - 가 나올 때 까지 앞에 수들은 분리하지 않고 모두 더해줘야 한다는 것만 염두하자.

 

a = input().split("-")
result = 0

for i in a[0].split("+"):
    result += int(i)
    
for i in range(1,len(a)):
    for j in a[i].split("+"):
        result -= int(j)
        
print(result)
반응형