[BOJ/Python] #1541번: 잃어버린 괄호
2022. 7. 29. 12:58ㆍ0️⃣ Algorithm&자료구조/BOJ
https://www.acmicpc.net/problem/1541
문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
예제 입력 1
55-50+40
예제 출력 1
-35
풀이
일단 문제를 잘 이해해야 한다. 30+45-60 을 계산해야 한다고 하자. 이때 최소를 만들기 위해
30+4(5-60) 처럼 생각할 수 있지만, 문제는 그것을 허용하지 않는다. 무조건 덧셈, 뺄셈 범위에서 식을 전개해야 한다.
자, 그렇다면 사실 간단해진다. 뺄셈 앞에 괄호를 치면 된다. 30+40+50-60+70-90+100-20 이 주어졌다. 뺄셈 연산자가 한 번만 오면, 그 뒤의 숫자는 모두 빼도 무방하다.
뺄셈 연산자가 나오면, 그 뒤의 모든 수는 뺀다.
위의 규칙을 성실히 수행하는 코드를 짜면 통과할 수 있다.
import sys
import re
# 케이스 입력받기
s = sys.stdin.readline().rstrip()
s_list = list(map(int, re.findall(r"[\w']+", s)))
operator = [i for i in s if i in ['+', "-"]]
# 첫 번째 값 처리
result = s_list[0]
s_list = s_list[1:]
game = True
while game == True:
for i in range(len(s_list)):
if operator[i] == '-':
s_list = s_list[i:]
result -= sum(s_list)
break
else:
result += s_list[i]
game = False
sys.stdout.write(str(result)+'\n')
'0️⃣ Algorithm&자료구조 > BOJ' 카테고리의 다른 글
[BOJ/미해결] #2667번: 단지 번호 붙이기👿 (0) | 2022.08.01 |
---|---|
[BOJ/Python] #1012번: 유기농 배추 (0) | 2022.07.31 |
[BOJ/Python] #1715번: 카드 정렬하기 (0) | 2022.07.28 |
[BOJ/Python] #1004번: 어린왕자 (0) | 2022.07.27 |
[BOJ/C++] #1789번: 수들의 합 (0) | 2022.07.25 |