
+와 -로만 이루어진 숫자 연산 문자열이 주어지고, 이를 이용해서 가장 적은 수가 나올 수 있게 괄호를 치고 그 값을 출력하는 문제이다.
예시로
55-50+40 = 45
55-(50+40) = -35
위와 같은 방식으로 괄호를 치는 것이다.
이경우는 저 방법 이외에 더 작게 만들 방법이 없으므로 가장 작은 값은 -35가 된다.
위의 예제를 포함해서 다른 것들도 생각해보면 결국 값을 최소화하는 것은 음수로 만들어줘야하고 제일 큰 값을 빼게 만드는 방법은 괄호를 -이후에 다 넣어주는 방법이다.
그렇지만 -가 등장하자마자 뒤의 모든 값을 한 번에 괄호치면 안되고
-와 - 사이의 값만을 적절히 괄호 쳐줘야된다.
35+45-25+50+620-112+51-455-452+2225+25
35+45-(25+50+620)-(112+51)-(455)-(452+2225+25)
이런식으로 괄호를 친다는 것이다.
이러함을 생각하고 문제를 풀었다.
- 주어진 문자열 입력받기
- 연산자와 숫자 분리하기
- 합을 위한 준비
- -와-사이의 값들을 합치기. 만약 - 가 없다면 그냥 일단 합치기. 이 값을 앖에 -가 있었는지 여부에 따라 -1을 곱해주고 어떤 리스트에 저장해두기
- 구한 모든 값을 출력
-일 경우에만 관련해서 생각하면 되는데 +연산자의 경우 그냥 합치기만 하면 되는 것이고 괄호에 대해서도 신경쓰지 않아도 되기에 그렇다.
하지만 -의 경우에는 이전 값들의 종료하고 괄호를 쳐서 합친 값을 리스트에 저장시키고 만약 괄호 앞에 마이너스가 있었다면 -1을 곱해주고 저장시키는 것도 생각해야되기에 아래처럼 코드를 작성했다.
else:
# -를 만났으니 이전까지 합했던 값을 집어넣기
if lst[i] == '-':
if is_minus== True:
value_list.append(value*-1)
else:
value_list.append(value)
# 한번 마이너스를 만난 뒤에 굳이 False로 바꿀 필요 없음.
is_minus = True
value = 0
또한 연산의 마지막에는 -나 +와 같은 연산자가 없이 숫자로 끝나기에 아래와 같은 코드도 입력해주었다.
if i == (len(lst)-1):
if is_minus== True:
value_list.append(value*-1)
else:
value_list.append(value)
이런 결과 아래와 같은 코드가 작성되었고, 제출하니 통과되었다.
import sys
S = sys.stdin.readline().strip()
S = S + '.'
lst = []
tmp = ''
for i in range(len(S)):
if S[i] != '.' and S[i] !='+' and S[i] !='-':
tmp += S[i]
else:
lst.append(int(tmp))
tmp=''
if S[i] !='.':
lst.append(S[i])
# -이후 에 괄호를 작용시켜보자.
# 괄호안의 값들의 합을 value로 저장
value = 0
# 모든 괄호 값들을 합한 것을 value_list에 저장
value_list = []
is_minus = False
for i in range(len(lst)):
# 연산자가 아니면 is_minus에 입력
if lst[i] != '+' and lst[i] != '-':
value += lst[i]
# 마지막 값이면 -를 만나지 않을테니 value_list에 입력
if i == (len(lst)-1):
if is_minus== True:
value_list.append(value*-1)
else:
value_list.append(value)
# 연산자를 만나면
# -와 -사이에서 합하고 value_list에 집어넣기
else:
# -를 만났으니 이전까지 합했던 값을 집어넣기
if lst[i] == '-':
if is_minus== True:
value_list.append(value*-1)
else:
value_list.append(value)
# 한번 마이너스를 만난 뒤에 굳이 False로 바꿀 필요 없음.
is_minus = True
value = 0
print(sum(value_list))
이 사람의 풀이는 -를 기준으로 구분하고 그 안에서 또 +를 기준으로 더하기를 하고 나온 리스트를 확인후
제일 앞의 값을 기준으로 다음 값들은 -를 해주는 형식으로 진행했다.
오.... 이런방법이!
exp = input().split('-') #'-'를 기준으로 split해서 exp 리스트에 저장
num = [] #'-'로 나눈 항들의 합을 저장할 리스트
for i in exp:
sum = 0
tmp = i.split('+') #덧셈을 하기 위해서 '+'를 기준으로 split
for j in tmp: #split한 리스트의 각 요소들을 더해줌
sum += int(j)
num.append(sum) #각 항의 연산 결과(덧셈)를 num에 저장
n = num[0] #식의 제일 처음은 숫자로 시작하기 때문에 0번째 값에서 나머지 값들을 빼준다
for i in range(1,len(num)): #1번째 값부터 n에서 빼준다
n -= num[i]
print(n)