m1ndy5's coding blog

프로그래머스 수식 최대화 with Python 본문

알고리즘 with python/알고리즘 스터디

프로그래머스 수식 최대화 with Python

정민됴 2023. 12. 12. 12:25

https://school.programmers.co.kr/learn/courses/30/lessons/67257
문제를 풀다가 풀릴듯 잘 안풀려서 다른 사람들은 어떻게 풀었나 하고 찾아봤는데 진짜 너무 깔끔한 코드가 있어서 공부할겸 포스트를 작성해야겠다.

from re import split
from itertools import permutations

def solution(expression):
    values = []

    # permutations으로 가능한 조합을 모두 계산해본다.
    for priority in permutations(['*', '+', '-'], 3):

        # 연산자를 기준으로 숫자 리스트를 만든다.
        operands = list(map(int, split('[\*\+\-]', expression)))
        # 연산자만 따로 저장한다.
        operators = [c for c in expression if c in '*+-']

        for op in priority:

            while op in operators:
                # 우선순위에 해당하는 연산자의 위치를 저장한다.
                i = operators.index(op)

                # 해당 연산자에 대한 계산을 진행한다.
                if op == '*':
                    v = operands[i] * operands[i+1]
                elif op == '+':
                    v = operands[i] + operands[i+1]
                else:
                    v = operands[i] - operands[i+1]

                # 계산된 결과값을 업데이트한다.
                operands[i] = v
                operands.pop(i+1)
                # 연산자 리스트를 업데이트 다.
                operators.pop(i)

        values.append(operands[0])
    # 제일 절대값이 큰 값을 꺼낸다.
    return max(abs(v) for v in values)

이와 같은 풀이랑 비슷하게 생각은 했었는데 expression을 계속해서 나눌 수 있다는 것을 생각을 못해서 원본리스트가 자꾸 망가져서 어떻게 다 계산해보지 했는데 계속 원본 expression을 나눠도 되는거였다(?)
시간 복잡도에 대해서 조금 더 공부가 필요할 것같다.

출처 : https://www.ai-bio.info/programmers/67257