알고리즘/백준

[DP] 1541번 : 잃어버린 괄호

jissue 2023. 3. 25. 11:00
문제 

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

 

출제 문제 : https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

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

www.acmicpc.net


해결 방법

잃어버린 괄호 문제 내용은 입력으로 주어진 부분을 신경쓰는게 포인트인 것 같다. 주어진 조건에 보면 식은 '0' ~ '9', '+', '-' 만으로 이루어져 있으며 맨 처음과 마지막은 숫자라고 한다.

 

처음에는 스택을 사용하여 flag로 +, - 를 해주는 방법과 eval() 함수를 사용하는 2가지 방법을 생각해 보았는데 좀 더 고민해 보니 split()을 이용하여 '-'를 기준으로 나누는 것이 좀 더 구현하기 편할 것 같다는 생각이 들었다.

 

만약, 예를 들어 30-20+30+40-20+30가 있다면 '-' 가 나온 후 다음 '-'가 나오기 전까지 괄호를 쳐야 가장 작은 값을 만들 수 있다. 정리를 하자면 30-(20+30+40)-(20+30)으로 구현하면 식의 값을 최소로 만들 수 있을 것이다. 이 방법을 생각하며 아래 코드를 작성해 보았다.

 

[코드]

import sys

datas = sys.stdin.readline().rstrip().split('-')

result = 0
# '-' 가 없을 경우
if len(datas) == 1:
        temp = datas[0].split('+')
        print(sum(list(map(int,temp))))

# '-' 가 한 개 이상 있을 경우
else:
    # 배열 첫번째 데이터 temp에 저장(유일한 '+' 연산)
    temp = sum(list(map(int,datas[0].split('+'))))
    for i in range(1,len(datas)):
        # 결과 값 '-' 진행 
        result-=sum(list(map(int,datas[i].split('+'))))
    # 전체 결과에서 temp '+' 연산
    print(result+temp)

처음에는 '-' 가 없는 경우를 생각하지 않고, 구현했더니 조건에 충족하지 못했다.

 

따라서, '-'가 있는 경우와 없는 경우를 나누어 구현했다.

 

여기서 주의할 점은 첫번째 데이터를 따로 계산해야 한다는 점인데 만약 for문을 0부터 시작한다면 sum에서 유일한 양수인 첫 배열 데이터가 '-'로 연산되기 때문에 처음에 따로 빼놓고, 이후에 추가로 계산해줬다.