[BOJ] 1541 잃어버린 괄호
그리디 알고리즘
내가 생각하는 해당 문제의 그리디 정당성은 다음과 같다
- 연산자는 + 와 - 만 존재하고, 처음과 마지막 문자는 숫자이다.
- 수 사이에 괄호를 칠 수 없다. ex): 55 + 40 - 30 → 5 ( 5+4 ) 0 - 30 이렇게는 못한다.
따라서 처음으로 - 부호가 나오면 뒤에 숫자들은 모두 빼버리면 최소값이 된다.
그래서 첫 - 부호를 기준으로 split을 수행한 후 앞은 더하고 뒤는 뺀다.
처음엔 eval함수를 사용하려 했으나 오히려 더 복잡한 것을 깨달음
equation = input()
minus_flag = False
li = list()
tmp = ''
for i in equation:
if i == '-':
li.append(tmp)
tmp = ''
if minus_flag is False:
minus_flag = True
li.append(i)
continue
if i == '+':
li.append(tmp)
tmp = ''
if minus_flag is True:
i = '-'
li.append(i)
continue
if tmp == '' and i == '0': # eval 은 0으로 시작하는 수에 대해 error반환
continue
tmp = tmp + i
li.append(tmp)
answer = ''.join(li)
print(eval(answer))
따라서 eval 대신 split을 적극 활용하여 다시 구현함
equation = input().split('-')
tmp = equation[0].split('+')
answer = 0
for e in tmp:
answer += int(e)
for e in equation[1:]: # - 부터는 전부 빼기
tmp = map(int, e.split('+')) # int 로 형변환
answer -= sum(tmp)
print(answer)