
+, -, * 3개의 연산 우선순위를 어떻게 하느냐에 따라 값이 달라지고 그 값들 가운데 최대값을 구하는 문제.
우선 (1) 3개의 연산자 순서를 어떻게 할 것인지에 대한 처리와 (2) 연산자 우선순위에 맞춘 계산방식 부분을 처리하면 될 것 같았다.
- 연산자 순서
순서를 따지는 순열이기 때문에 permutations을 사용했는데 연산의 개수가 3개밖에 되지 않기 때문에 전체 개수는 3! = 6개 라서 하나씩 다 써도 된다. 그게 훨씬 빨랐을 수도 있을 거 같다.
사실 6개라서 다 나열해놓고 전부 다 구해도 되는데 풀이에서는 expression에 등장하는 연산자만 가지고 순열을 구했다. 결과적으론 훨씬 더 빠르지 않았을까? ㅎㅎㅜ
- 계산 방식
식 자체가 하나의 문자열로 주어지기 때문에 숫자와 연산자를 구분할 수 있어야 했다. 연산자를 기준으로 split을 사용해도 될 것 같고 정규 표현식도 쓸 수 있을 거 같았지만 정규 표현식은 잘 모르고 split으로 쓰는 게 더 어려울 것 같아서 그냥 하나씩 다 구했다. 잘못된 연산식은 없다는 전제가 있어야만 구할 수 있는 방식으로 연산자가 들어오면 그 이전까지이 문자는 숫자로 간주하고 숫자 배열 nums에 추가하고 연산자는 연산자 배열 exp에 추가했다.
계산 방식은 숫자와 연산자 배열을 큐로 구현해서 진행했다. 두 배열 모두 가장 앞의 값을 꺼내서 확인하고 다시 뒤에 추가되는 방식으로 구현되었다. 기준은 연산자 배열 기준이며, 만약 꺼낸 연산자가 현재 우선순위인 연산자가 아니라면 숫자와 연산자 모두 기존 배열의 뒤에 다시 추가된다.
만약 현재 우선순위인 연산자라면 꺼낸 숫자와 숫자 배열의 가장 뒤의 값을 가져와서 연산을 수행한다. 위의 두 값이 연산자 양 옆의 값이기 때문이다. 연산을 진행한 뒤 다시 숫자 배열의 뒤에 추가한다.
이 과정은 모든 연산자가 사라질때까지 반복된다. 정상적으로 연산이 수행되었다면 숫자 배열에 남아있는 숫자는 1개가 된다. 이 값의 절대값만 반환한다.
def solution(expression):
expression = list(expression)
nums, exp, char = [], [], ''
while expression:
tmp = expression.pop(0)
if tmp in ('-', '*', '+'):
nums.append(int(char))
exp.append(tmp)
char = ''
else:
char += tmp
nums.append(int(char))
def calc(a, b, e):
if e == '-':
return a-b
elif e == '*':
return a *b
elif e == '+':
return a+b
def math(perm, nums, exp):
for e in perm:
nums.append(nums.pop(0))
for _ in range(len(exp)):
i = exp.pop(0)
if i == e:
nums.append(calc(nums.pop(), nums.pop(0), e))
else:
nums.append(nums.pop(0))
exp.append(i)
return abs(*nums)
ans = 0
for perm in permutations(set(exp), len(set(exp))):
ans = max(ans, math(perm, nums[:], exp[:]))
return ans
from itertools import permutations