[백준] 1541번 - 잃어버린 괄호 | 파이썬

SangJin Ham·2023년 8월 9일
0

백준

목록 보기
36/51
post-thumbnail

1260번 - DFS와 BFS

시간제한 : 2초
메모리 제한 : 128MB


문제

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

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

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


입력

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


출력

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


예제 입력 1

55-50+40

예제 출력 1

-35

코드

import sys

# -를 기준으로 나누고
# -가 없으면 split된 것도 없으므로 arr의 가장 첫 번째 원소 다 더하기
# -가 존재하는 경우 첫 '-' 뒤로 나오는 숫자들을 두 번째 '-' 나올 때까지 다 더하고(이미 -를 기준으로 split했기 때문에 나머지는 +일 거임) 첫 번째 원소 다 더한거에서 다 뺀다.

arr = list(map(str, sys.stdin.readline().strip().split('-')))
answer = 0
for i in arr[0].split('+'):
  answer += int(i)

for i in arr[1:]:
  for j in i.split('+'):
    answer -= int(j)

print(answer)

풀이

시간 : 48ms
메모리 : 31256KB

이 문제는 최소의 값을 더해서 최대의 값을 빼주면 된다.
먼저 -를 기준으로 식을 다 나눠준다

  • ex) 10+20-30+10+20-30+10+20

만약 위 식처럼 -가 2개 있어 아래처럼 -를 기준으로 식이 세 부분으로 나눠졌다고 가정해보자.

  • (10+20)-(30+10+20)-(30+10+20)

첫 번째 부분(10+20)을 +를 기준으로 split해 answer에 다 더해주고, 나머지 두 번째와 세 번째 부분은 +를 기준으로 split해서 answer에서 다 빼주면 된다.

만약 식에 -가 없어 첫 번째 부분만 존재한다고 하면, 두 번째 for문은 동작하지 않으므로, 첫 번째 부분의 원소들을 다 더해 출력해준다.

profile
끄적끄적

0개의 댓글