[문제 바로가기] https://www.acmicpc.net/problem/1541
세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.
그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.
괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.
입력
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.출력
첫째 줄에 정답을 출력한다.
문제 난이도가 어렵지 않았지만 꼼꼼히 읽지 않아서 비효율적으로 코드를 만든 문제... → 반성의 의미로 글 남기기 😂
괄호 추가로 최대 혹은 최소값을 만드는 유형의 문제를 너무 많이 풀어서 습관적으로 코드를 작성한게 잘못이었다.
문제의 조건들이 있었지만 내가 확인한 건 '괄호를 추가하여 최소값 만들기'가 전부였다. 그렇다보니 아래와 같은 (비효율적인) 과정이 나왔다.
step 1)
먼저, eval()함수는 '013'과 같은 문자열을 넣었을 때 Syntax Error가 발생하므로 형변환으로 정리하였다.
step 2)
'+' 연산을 먼저 진행한 후 '-' 진행을 하는 것이 최소값이므로 식(given)에 '+'가 존재할 때 까지 아래의 반복문을 진행한다.
step 3)
문자열에 '+'가 없으면 남은 식은 eval()함수를 사용하여 처리한다.
코드는 다음과 같다.
처음 시도
rigin = input()
pm = '+-'
given, num = '', ''
for i in origin:
if i not in pm:
num += i
else:
given += str(int(num))
given += i
num = ''
given += str(int(num))
given.split('+')
while given.count('+'):
plus = given.index('+')
left, right = '', ''
for idx in range(plus-1, -1, -1):
if given[idx].isnumeric():
left += given[idx]
else:
break
for idx in range(plus+1, len(given)):
if given[idx].isnumeric():
right += given[idx]
else:
break
given = given[:plus-len(left)] + str(int(left[::-1])+int(right)) + given[plus+len(right)+1:]
print(eval(given))
split() 함수로 '-', '+'를 순차적으로 분리한 후 계산하면 코드가 훨씬 짧아진다.
코드는 다음과 같다.
수정한 코드
given = input().split('-')
s = 0
for i in given[0].split('+'):
s += int(i)
for i in given[1:]:
for j in i.split('+'):
s -= int(j)
print(s)
코드 길이에 비해 시간, 메모리 차이는 별로 나지 않은게 신기했다...