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 난이도가 아닌 것 같은 느낌이랄까..?
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2 - 빛의 경로 사이클 (파이썬) (0) | 2022.04.03 |
---|---|
[프로그래머스] Lv2 - 튜플 (파이썬) (0) | 2022.04.02 |
[프로그래머스] Lv2 - 거리두기 확인하기 (파이썬) (0) | 2022.04.01 |
[프로그래머스] Lv2 - 괄호 변환 (파이썬) (0) | 2022.04.01 |
[프로그래머스] Lv2 - 메뉴 리뉴얼 (파이썬) (0) | 2022.03.31 |