1 minute read

백준 문제 중 1541번

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

문제

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

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

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

입력

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

출력

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


풀이

이 문제의 포인트는 두가지이다.

  1. 최소가 되게끔 하는 조건을 생각하는것
  2. 0008, 0009같이 0으로 시작하는 수를 처리하는 것

첫번째 조건은 문자열을 스캔하다가 ‘-‘가 나올때마다 -를 기준으로 left와 right항을 나누고 ‘-‘연산을 하기전에 left right를 먼저 계산 하면 right가 가능한한 최대의 값을 가질것이고 그러므로 left - right는 최소가 될것이다.

예를들어

‘10-20+30+40-20-10’ 가 주어졌을때 [10, 20+30+40, 20, 10] 으로 나누고 연산을 하면된다.

내가 헤맸던 부분은 두번째의 ‘0008’의 처리였다.

처음 시도 했을때 ‘0008’을 eval로 평가해서 대입하려고 했는데 오류가 발생했었다.


# eval('50+40')
eval('0008')
  File "<string>", line 1
    0008
       ^
SyntaxError: invalid token

이를 해결하기 위해서 다른 접근이 필요했고, 문자열을 +를 기준으로 split하여 직접 더하는 식으로 해결했다.

numsops = input()

nums = []


 # 임시로 문자열을 저장할 변수 선언
tmp = ''

for c in numsops:

     # '-'를 발견한다면 tmp에 담긴 문자열을 nums에 넣는다.
    if c == '-':
        nums.append(tmp)
        tmp = ''

     # '-'를 만나기 전까지 문자열을 tmp에 담는다
    else:
        tmp += c

 # 마지막 수는 -를 만날수 없으므로 바로 넣는다.
nums.append(tmp)


 # left right들로 쪼개진 nums안의 식들을 계산
for i in range(len(nums)):
    tmp = 0

     # 문자열을 '+' 기준으로 쪼개서 더해줌
    for num in nums[i].split('+'):
        tmp+=int(num)
    nums[i] = tmp


 # left - right 실행
for i in range(1,len(nums)):
    nums[i] = nums[i-1] - nums[i]

print(nums[-1])
0080-0090
-10

Leave a comment