[프로그래머스] 수식 최대화

재귀(트리), 순열


이 문제는 연산자의 우선순위를 정해서 연산을 했을 경우 최댓값을 도출하는 문제이다. 연산의 종류는 총 3가지이다.

따라서 모든 조합의 경우의 수를 고려해도 6가지밖에 나오지 않는다. 따라서 permutations를 부담없이 사용해도 된다.

그리고 split을 우선순위의 역순으로 사용하며 재귀를 통해 연산을 이어나간다. try-except 구문을 이용하여 int로 형변환을 하고 에러가 발생한다면 아직 연산자가 남았다는 뜻으로 재귀를 이어나간다. 코드는 아래와 같다.

구현


from itertools import permutations

def recursion(expression, ops, depth):
    tmp_lst = expression.split(ops[depth])
    # 초기 값 설정
    try:
        answer = int(tmp_lst[0])
    except:
        answer = recursion(tmp_lst[0], ops, depth+1)
    # 계산
    for i in range(1, len(tmp_lst)):
        try:
            value = int(tmp_lst[i])
        except:
            value = recursion(tmp_lst[i], ops, depth+1)
        if ops[depth] == "*":
            answer *= value
        elif ops[depth] == "-":
            answer -= value
        elif ops[depth] == "+":
            answer += value
    return answer

def solution(expression):
    operators = ['*', '-', '+']
    priority = list(permutations(operators, 3))
    answer = 0
    for op in priority:
        answer = max(answer, abs(recursion(expression, op, 0)))
    return answer

print(solution("100-200*300-500+20"))
print(solution("50*6-3*2"))