[프로그래머스] Lv2 수식 최대화
풀이(python)
from itertools import permutations
def solution(expression):
answer = 0
expressionList = list(expression.replace('+', ' + ')
.replace('-', ' - ')
.replace('*', ' * ')
.split(' '))
operation = [ch for ch in expression if not ch.isdigit()] # 연산자만 분리한 리스트
precedences = list(permutations(set(operation))) # 연산자 우선순위 순열
for precedence in precedences:
tmpList = expressionList
for pre in precedence:
stack = []
for num2 in tmpList:
if stack and stack[-1] == pre:
stack.pop()
num1 = stack.pop()
stack.append(str(eval(num1 + pre + num2)))
else:
stack.append(num2)
tmpList = stack
answer = max(answer, abs(int(tmpList[0])))
return answer
설명
- 숫자와 연산자로 이어진 문자열을 리스트의 원소들로 만들었다. 연산자는 숫자 사이에 있기 때문에 연산자 앞뒤로 공백을 만들어주고, 공백을 기준으로 split했다.
- 연산자 우선순위 정의는 순열을 통해 만든다. (permutations 사용) 그리고 중복되는 연산자도 있을 수 있으니 set()을 사용한다.
- 우선순위 순열을 하나씩 계산해서 확인하며 최댓값을 구한다. 계산은 중간 결과값을 저장하기 좋은것 같아 스택을 사용했다.
- 현재 계산해야되는 연산자가 오면 스택에서 pop후 계산해서 push한다.
예를 들어 우선순위가
* > - > +
일때,*
부터 계산한다. 스택에 원소를 하나씩 넣다가 스택의 최상단 값이*
이면 두번 꺼내서 계산한 후 결과값을 넣는다.
이때 처음 꺼내지는건 연산자이고 두번째로 꺼내지는건 숫자num1
이다.
*
연산 후 남은 수식들이tmpList
에 들어간다.*
연산이 끝난후 다음으로 우선순위가 높은-와 +
를 계산한다. - 수식내 모든 연산자를 계산하면
tmpList
에는 최종 결과값만 남는다. 최종 결과값의 절대값과answer
중 더 큰값을answer
에 넣는다.
쉽지 않았ㄷr..
Author And Source
이 문제에 관하여([프로그래머스] Lv2 수식 최대화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eunbani/프로그래머스-Lv2-수식최대화저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)