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

알고리즘 저장소·2021년 5월 6일
0

프로그래머스

목록 보기
14/29

1. 요약

연산자 우선순위를 임의로 바꿨을 때, 주어진 수식에서 나올 수 있는 값 중 절대 값이 가장 큰 값을 구하는 문제.

2. 아이디어

순열을 이용하여, 연산자 순서로 나올 수 있는 경우를 구한다. 주어진 순서대로 연산을 실행하여 수식에서 나온 값 중 절대 값이 가장 큰 값을 구하면 된다.

아이디어는 간단하지만 구현을 어떻게 하느냐에 따라 어렵게 느껴질 수 있는 문제인데, 나의 경우 주어진 수식을 [숫자, 연산자, 숫자, 연산자]와 같은 형식으로 리스트를 만들었다.

이후 연산자의 순서에 따라 계산하고 나온 값을 바로 1번째 피연산자의 인덱스에 연산 결과를 삽입하고 1번째 피연산자와 연산자, 2번째 피연산자를 지웠다. 삽입의 경우 python의 deque에서 제공하는 insert함수를 사용했다.


3. 코드

from itertools import permutations
from collections import deque, defaultdict

def solution(expression):
    OPS = ('+', '-', '*')
    ops = []
    opee = deque()
    num = ''
    
    for ch in expression:
        if ch in OPS: 
            opee.append(num)
            opee.append(ch)
            num = ''
            ops.append(ch)
            continue
        num += ch
    
    opee.append(num)
    _ops = set(ops)
    answer = 0

    for case in permutations(_ops):
        _opee = [x for x in opee]
        _opee = deque(_opee)

        for case_op in case:
            i = 0            
            while i < len(_opee):
                if _opee[i] == case_op:
                    x = str(eval(_opee[i-1]+case_op+_opee[i+1]))
                    i -= 1
                    _opee.insert(i, x)
                    _opee = [_opee[k] for k in range(len(_opee)) if k not in (i+1, i+2, i+3)]
                    continue
                i += 1
        
        answer = max(answer, abs(int(_opee[0])))
    return answer

0개의 댓글