백준 문제 중 1541번, 그리디, ‘잃어버린 괄호’
백준 문제 중 1541번
https://www.acmicpc.net/problem/1541
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
풀이
이 문제의 포인트는 두가지이다.
- 최소가 되게끔 하는 조건을 생각하는것
- 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