문제:
풀이방법:
연산자를 계산하는 방법으로 주로 스택을 사용하기 때문에 스택을 사용하고, 수식의 갯수가 3개이므로 최대 6가지 조합이 가능하기 때문에 브루트 포스 방법을 사용해서 모든 케이스에 대해 계산을 하고 그 중 최대값을 찾는 방법을 사용한다.
우선 정규표현식과 itertools의 permutations을 사용해서 입력받은 expression에 대해서 숫자와 수식을 분리해내고, 연산자들의 우선순위를 만든다.
생성된 우선순위별로 숫자와 연산자들을 스택에 넣고, 연산자가 현재 해당하는 우선순위의 연산자라면 숫자 스택에서 두 개를 빼고, 연산자 스택에서 하나를 빼서 연산을 하고 다시 숫자 스택에 넣도록 한다.
이 과정을 우선순위와 연산자별로 계속 반복해서 하고 이 중 max 값을 찾아서 반환하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
def calculate(a,b,op):
if op=="+":
return a+b
elif op=="*":
return a*b
else:
return a-b
def solution(expression):
import re
from itertools import permutations
prior = list(permutations(["+","*","-"],3))
digit = re.compile("[0-9]+")
operator = re.compile("[^0-9]")
numbers = list(map(int,digit.findall(expression)))
oper = list(operator.findall(expression))
answer = 0
for pr in prior:
number = numbers
ope = oper
for i in range(3):
stack = [number[0]]
stack_op = []
count = 1
while count < len(number):
stack.append(number[count])
stack_op.append(ope[count-1])
count+=1
if stack_op[-1]==pr[i]:
b = stack.pop(-1)
a = stack.pop(-1)
op = stack_op.pop(-1)
stack.append(calculate(a,b,op))
number = stack
ope = stack_op
answer = max(answer,abs(number[0]))
return answer
|
cs |
문제링크:
https://programmers.co.kr/learn/courses/30/lessons/67257
'Algorithm > Python' 카테고리의 다른 글
[Programmers]2020 카카오 인턴십. 보석 쇼핑 (0) | 2020.07.16 |
---|---|
[BOJ]2164. 카드2 (0) | 2020.07.14 |
[Programmers]2020 카카오 인턴십. 키패드 누르기 (0) | 2020.07.07 |
[BOJ]1543. 문서 검색 (0) | 2020.07.02 |
[BOJ]5525. IOIOI (0) | 2020.06.30 |