[프로그래머스/파이썬] 수식 최대화(67257) 풀이

업데이트:



문제 정보


풀이

문제

숫자와 연산자(+, -, *)로 이루어진 수식이 주어질 때, 연산자 우선순위를 임의로 정해서 계산한 결과의 절댓값 최댓값을 구하는 문제입니다.

연산자 종류는 최대 3개이므로 우선순위 경우의 수(순열)를 모두 시도할 수 있습니다.

코드

def solution(expression):
    answer = 0

    cases = []
    for i in range(3):
        for j in range(3):
            for k in range(3):
                if i!=j!=k!=i: cases.append({i:'+', j:'-', k:'*'})

    conv = []
    ops = set(list('+-*'))
    i, prev = 1, 0
    while True:
        if i >= len(expression):
            conv.append(int(expression[prev:]))
            break
        if expression[i] in ops:
            conv.append(int(expression[prev:i]))
            conv.append(expression[i])
            prev = i + 1
        i += 1
    
    for case in cases:
        tmp = conv[:]
        for i in range(3):
            while True:
                try:
                    st = tmp.index(case[i])
                    tmp = tmp[:st-1] + [eval(''.join(map(str,tmp[st-1:st+2])))] + tmp[st+2:]
                except: break
        answer = max(answer, abs(tmp[0]))
                
    
    return answer

설명

풀이 흐름은 크게 두 단계입니다.

  • 수식을 [숫자, 연산자, 숫자, ...] 형태 토큰 리스트로 변환
  • 연산자 우선순위 6가지(3!)를 모두 적용해 결과 계산

특정 우선순위를 적용할 때는 현재 우선 연산자를 토큰 리스트에서 반복적으로 찾아 계산하고, 계산된 값을 다시 리스트에 넣는 방식으로 식을 줄여갑니다.

모든 우선순위 케이스의 결과 절댓값 중 최댓값이 정답입니다.



댓글남기기