실패 log
Greedy 첫 문제로 minus를 기준으로 가장 작은거에서 가장 큰거를 빼야 하는 것만 인지했다. 이중 괄호 여부도 의문이었고, 여러가지를 생각했는데 딱 하나 알겠는 것은 기준이 매 연산마다 최소가 돼야한다는 것 뿐이었다.. 이 최소가 될 조건을 찾아야하는데 거기까지는 생각하지 못하고 시간이 지나 다른 분들의 풀이를 보게 되었다.
-가 기준이 된다는 힌트를 얻게 되었다. 이 논리의 핵심은 파악을 제대로 못하고, 직접 코드를 짜보고 싶어서 일단 짰다.
import sys
import re
input=sys.stdin.readline
line = input()
p= re.compile('(\d+)([-+])?') # 전에 정규식으로 나눈 모습이 인상적이라서 쓰게 되었다.
compiled = p.findall(line)
print(compiled)
query=''
is_opened=False
for com in compiled:
query+=str(int(com[0])) # 피연산자는 넣고 보자
if com[1]=='-': ## is_opened로 관리했을 때 문제는 또 -가 나온건데 괄호를 새로 치지 못한다는 점이다.. 그래서 틀렸다!
print(is_opened)
if is_opened: # 열렸을 때는 닫도록 하고 싶었다.
query+=')'+com[1]
is_opened=False
else:
query+=com[1]+'('
is_opened=True
else : query+=com[1]
if is_opened : query+=')' # 안닫혔을 경우 처리
print(query)
print(eval(query)) # eval : string에 올바른 연산자와 숫자만 있을 경우 연산해주는 함수
이후로 다시 다른 분들의 코드를 보았다. 아쉽다. 아직 문자열 다루는 능력?이 부족한 것 같다.
-기준으로 괄호를 열고 닫는 다는 것의 논리는 아래와 같다.
-를 만날 때 가장 큰 수를 빼면 된다.
최초로 마이너스가 나오기 전까지 나오는 숫자는 모두 더할 수 밖에 없고, 이후 마이너스가 나오는 순간 그 뒤에 모든 수를 빼주면 된다.
55-50+40 이 곧 50 왼쪽과 40 오른쪽에 괄호를 열고 닫으면, 55-50-40으로 만드는 것과 같은 결과이다.
s=input().split('-') # -를 기준으로 split 하면 더해줄거 더해주고 뺄거 빼면 된다.
sum=0
for i in s[0].split('+'): # 0번째 배열에는 모조리 더할 거 밖에 없음
sum+=int(i) # 그래서 다 더함
for i in s[1:]: # 그 뒤로는 다 빼줄거 밖에 없음
for j in i.split('+'): # + 기준으로
sum-=int(j) # 하나씩 빼주기
print(sum)
의문점..
1. 그 뒤로 다 빼줘도 되나?
55-50+40-30+20
55/ 50+40/ 30+20
55/ -50-40/ -30-20
그렇다.
10-20+30-40
10/20+30/40
10/ -20-30/ -40
그렇네.
10-20+30-40-50+60+70
10/20+30/40/50+60+70
10/-20-30/-40/-50-60-70
맞다..
[참고]
import sys
input = sys.stdin.readline
line = input().strip()
result=0
split_min = line.split('-')
front=split_min.pop(0).split('+')
for f in front:
result+=int(f)
while split_min:
front = split_min.pop(0).split('+')
for f in front:
result-=int(f)
print(result)