문제
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.
출력
첫째 줄에 정답을 출력한다.
예제 입력 1
55-50+40
예제 출력 1
-35
예제 입력 2
10+20+30+40
예제 출력 2
100
예제 입력 3
00009-00009
예제 출력 3
0
이 문제를 해결하는데 생각해야할 부분은 2가지 였습니다.
1. 조건에 맨 앞과 맨 뒤에는 숫자라는 것은 맨 앞과 맨 뒤는 -가 붙지 않는다는 것이었습니다.
2. 1번째 값은 반드시 +값인 거고 그 이후에 -가 나타나면 -가 또 나타나기 전까지 +로 더해지는 연산들을 괄호로 묶여져야 최소값이 된다
즉 예를 들면, 10+30-50+25+40+50+60-70-20이라면,
[10+30], [50+25+40+50+60], [70], [20]으로 보게 되면, (40 - (225) + 70 + 20) 이 되어 최소 값인 -95가 됩니다.
'-' 단위로 먼저 묶어준다면 기본적인 -의 범위를 괄호로 묶어줄 수 있게 됩니다. 그리고나서 그 안에 값들을 후에 더해줄 지 빼줄지만 파악하여 연산을 해주면 되는 것입니다.
저는 괄호로 묶어준 값들에 대하여 후에 더해줘야 할 지 빼줘야 할지를 연산부호값(plus or minus)를 둬서 후에 최소값을 계산할 때 반영되도록 하였습니다. 사실 완전한 Plus 값은 첫번째 인덱스에서 뻗어져서 끝날때까지 +일때만 다 양의 값이며 중간에 한번이라도 -에 값이 나오게 되면 그 때부터는 +의 의미가 - 괄호에 종속되어야 하기 때문에 상태값이 필요가 없이 [1] 부터는 더해진 값들은 -로 봐도 되긴 하나.. 저는 읽기 쉬운 코드가 되도록 하기 위해서 연산 부호 값(plus,minus)를 집어넣어서 표현했습니다.
코드는 다음과 같습니다.
Problem = input()
splitedProblemByMinus = Problem.split("-")
for idx in range(len(splitedProblemByMinus)):
if idx >= 1:
splitedProblemByMinus[idx] = [splitedProblemByMinus[idx], 'minus']
else:
splitedProblemByMinus[idx] = [splitedProblemByMinus[idx], 'plus']
for idx, element in enumerate(splitedProblemByMinus):
splitedProblemByMinus[idx][0] = element[0].split('+')
cur = 0
for element in splitedProblemByMinus:
tmp = 0
for i in element[0]:
tmp += int(i)
if element[1] == 'minus':
tmp = tmp * -1
cur += tmp
print(cur)
'알고리즘 > 문제풀이' 카테고리의 다른 글
백준 1676번 팩토리얼 0의 개수 : Python (1) | 2023.03.15 |
---|---|
백준 1620번 나는야 포켓몬 마스터 이다솜 - Python (0) | 2023.03.14 |
백준 1927번 최소힙 - Python (0) | 2023.03.12 |
백준 1764번 듣보잡 - Python (0) | 2023.03.11 |
백준 17219번 비밀번호 찾기 - Python (0) | 2023.03.10 |