[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)

태그:

카테고리:

업데이트: