본문 바로가기
Algorithm/프로그래머스

[프로그래머스] Lv2 - 수식 최대화 (파이썬)

by 2HS 2022. 4. 2.
from itertools import permutations as perm
from collections import deque


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


def make_result(priority, expression):
    # arr 만들기
    arr = deque()
    num = ''
    for k in expression:
        if k.isdigit():
            num += k
        else:
            arr.append(num)
            num = ''
            arr.append(k)
    arr.append(num)
    # 계산
    for op in priority:
        stack = []
        while len(arr) != 0:
            temp = arr.popleft()
            if temp == op:
                result = str(eval(stack.pop()+op+arr.popleft()))
                stack.append(result)
            else:
                stack.append(temp)
        arr = deque(stack)
    return int(arr.pop())

 

2020 카카오 인턴십
1. permutations를 이용해서 3가지 수식의 우선순위 순서를 정한다.
2. 해당 우선순위를 가지고 make_result (계산한 결과 값을 리턴)
    - 숫자와 연산자가 들어간 배열 arr 만들기
    - priority의 순서대로 계산
        - popleft를 해가면서 해당 연산자가 나올 때까지 스택에 append
        - 해당 연산자가 등장하면 stack의 마지막 숫자를 pop, arr에서 popleft
        - 해당 값들을 이용해서 eval을 이용해 계산된 값을 문자열로 바꾸고 다시 stack에 append
        - arr을 stack으로 초기화
        - arr의 마지막 값 하나를 int화 해서 반환
3. 결과들의 최댓값을 리턴

 

보자마자 permutations와 stack을 이용해야겠다는 생각이 들었지만

처음에는 우선순위에 맞게 괄호를 추가해서 한 번에 eval 처리를 했다.

그러나 곱하기 연산을 수행할 때, 앞의 연산자가 '-' 이어도 음수 값이 아닌 양수로 곱하기 연산을 수행하는 로직이 됐다.

다시 처음부터 다 지우고 천천히 풀어서 겨우 통과했다.

 

Lv2 난이도가 아닌 것 같은 느낌이랄까..?