읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
처음 풀이했을 땐 분할 정복으로 가능한 경우의 수를 list에 저장한 뒤 min()으로 가장 작은 값을 출력해봤으나 연산자가 많아질 수록 경우의 수도 기하급수적으로 늘어나 시간 초과가 발생하였다. 문제를 다시 읽어보면 연산자는 +와 -만 존재한다고 명시되어 있다. 그렇다면 더하는 건 최소로 더하고 빼는 수를 가장 크게 만들어야 한다. 그렇다면 - 연산자와 다음 - 연산자 사이는 모두 더해지는 값이므로 이 부분에 대해서만 괄호로 묶어주면 + 연산자만 존재하지 않는 한 첫 번째 값에서 항상 값을 빼는 형태로 완성될 것 같다.
python 코드-1(시간초과)
def compute(left, right, value):
result = []
for l in left:
for r in right:
result.append(eval(str(l) + value + str(r)))
return result
def solve(expression):
if expression.isdigit():
return [int(expression)]
sol = []
for idx, value in enumerate(expression):
if value in '+-':
left = solve(expression[:idx])
right = solve(expression[idx + 1:])
sol.extend(compute(left, right, value))
return sol
expression = input()
sol = solve(expression)
print(min(sol))
python 코드-2
expression = input()
exp_list = expression.split('-') # - 연산자로 구분
for i in range(len(exp_list)): # 나머지 식들에 대해
exp_list[i] = sum(map(int, exp_list[i].split('+'))) # 모두 덧셈 처리
sol = exp_list[0] # 초기 값은 항상 양수
for item in exp_list[1:]:
sol -= item # 첫번째 값에서 나머지 원소들은 모두 뺄셈
print(sol)
오히려 알고리즘으로 어렵게 풀었을 때 시간초과가 나오는 문제였다.
'Algorithms > Baekjoon' 카테고리의 다른 글
BOJ #1699 제곱수의 합 (0) | 2021.04.24 |
---|---|
BOJ #1009 분산처리 (0) | 2021.04.24 |
BOJ #1759 암호 만들기 (0) | 2021.04.24 |
BOJ #1002 터렛 (0) | 2021.04.08 |
BOJ #9020 골드바흐의 추측 (0) | 2021.04.08 |