문제
주어진 수식에서 연산자를 통해 가능한 모든 결과를 계산하는 문제입니다. 수식은 숫자와 연산자(+, -)로 이루어져 있습니다.
연산자에 따라 숫자를 결합하여 다양한 결과를 얻을 수 있습니다. 예를 들어, 수식 1 - 3 + 5 - 8이 주어졌을 때, 이 수식을 계산할 수 있는 모든 가능한 결과의 최댓값 구하는 것이 목표입니다.
각 숫자와 연산자를 이용하여 여러 가지 방식으로 수식을 분할하고 결합하여 가능한 결과의 리스트를 반환하도록 solution 함수를 작성하세요.
풀이
메모이제이션 & 분할정복
- 주어진
arr리스트에서 수식의 숫자와 연산자를 분리하여 조합을 계산합니다. - 재귀적으로 수식을 나누고 각 부분에 대해 가능한 결과를 계산합니다. 이때, 연산자의 위치를 기준으로 수식을 왼쪽과 오른쪽으로 나눕니다.
- 왼쪽 부분과 오른쪽 부분의 결과를 각각 계산한 후, 두 부분에서 얻은 결과를 가지고 현재 위치의 연산자를 적용합니다.
- 각각의 조합에 대해 결과를 누적하여 모든 가능한 결과를 리스트에 저장합니다.
- 수식을 다 나눈 후, 최종 결과 리스트를 반환합니다. 리스트 중 max값을 return합니다.
코드
def operate(a, b, op):
if op == '+':
return a + b
else:
return a - b
# 메모이제이션을 위한 딕셔너리 추가
memo = {}
def cal(arr):
# 배열을 튜플로 변환해서 딕셔너리의 키로 사용 가능하게 처리
key = tuple(arr)
# 메모이제이션된 결과가 있으면 바로 반환
if key in memo:
return memo[key]
# 숫자 하나만 남았을 때 처리
if len(arr) == 1:
return [int(arr[0])]
result = []
# 연산자를 기준으로 분할하여 재귀적으로 호출
for i in range(1, len(arr), 2): # 연산자는 인덱스가 홀수에 위치
op = arr[i]
left = cal(arr[:i]) # 왼쪽 부분 계산
right = cal(arr[i + 1:]) # 오른쪽 부분 계산
# 왼쪽과 오른쪽 부분을 각각 연산
for l in left:
for r in right:
result.append(operate(l, r, op))
# 메모이제이션 저장
memo[key] = result
return result
def solution():
answer = -1
arr = ["1", "-", "3", "+", "5", "-", "8"]
print(cal(arr)) # 가능한 모든 결과 출력
return max(answer)
solution()