문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/67257
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
from itertools import combinations,permutations
from collections import deque
def operation(num1, num2, op):
if op == '+':
return str(int(num1) + int(num2))
if op == '-':
return str(int(num1) - int(num2))
if op == '*':
return str(int(num1) * int(num2))
def calculate(exp,op):
buf = ""
arr = []
for i in exp:
if i.isdigit()==True:
buf += i
else:
arr.append(buf)
arr.append(i)
buf = ""
arr.append(buf)
for o in op:
stack = []
while len(arr) != 0:
tmp = arr.pop(0)
if tmp == o:
stack.append(operation(stack.pop(),arr.pop(0),o))
else:
stack.append(tmp)
arr = stack
return abs(int(arr[0]))
def solution(expression):
c = ['*','-','+']
result = []
check = list(permutations(c,3))
for op in check:
result.append(calculate(expression,op))
return max(result)
풀이
- 문제가 길어지면 함수를 쪼개서 사용하는 것이 좋은 것 같다.
- 위 문제는 두가지 로직으로 나누었다
- 연산자를 문자열로 받기 때문에 실제 계산하는 것을 조건문으로 수행
- 우선순위에 따른 계산
- 핵심 로직은 연산자 우선순위에 따른 계산인데, while문으로 모든 계산이 종료될 때까지 반복하는 것이다.
- 연산자일때 stack에 넣었던 가장 최근의 값과, 다음 계산 대상으로 pop(0)을 한번 더 해서 operation 함수를 실행한다.
- 숫자일경우 stack에 넣기만 하고, 한 연산식에 대한 계산을 했으므로 arr = stack을 하고 다시 반복한다.
'👨🏻💻알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv1. 기사단원의 무기 (0) | 2023.02.11 |
---|---|
[프로그래머스] Lv1. 숫자 짝꿍 (0) | 2023.02.11 |
[프로그래머스] Lv2. 괄호 변환 (0) | 2023.02.06 |
[프로그래머스] Lv2. 메뉴 리뉴얼 (0) | 2023.02.06 |
[프로그래머스] Lv2. 2개이하로 다른 비트 (0) | 2023.02.04 |