반응형
programmers.co.kr/learn/courses/30/lessons/67257
코딩테스트 연습 - 수식 최대화
IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과
programmers.co.kr
import itertools
def solution(expression):
answer = []
operator = ['*', '+', '-']
my_exp = []
num = ''
for i in expression: # 숫자 or 연산자 단위로 리스트에 저장
if i in operator:
my_exp += [int(num), i]
num = ''
else:
num += i
my_exp.append(int(num))
for each_permut in list(itertools.permutations(operator, 3)): # 가능한 연산자 우선순위 순열
dup_exp = my_exp[:]
for op in each_permut:
while op in dup_exp: # 우선순위 대로 연산자를 찾아서 계산
loc = dup_exp.index(op)
if op == '*':
result = dup_exp[loc - 1] * dup_exp[loc + 1]
elif op == '+':
result = dup_exp[loc - 1] + dup_exp[loc + 1]
else:
result = dup_exp[loc - 1] - dup_exp[loc + 1]
dup_exp[loc-1] = result
dup_exp = dup_exp[:loc] + dup_exp[loc+2:]
answer.append(abs(dup_exp[0])) # 순열 마다 결과값의 크기를 저장
return max(answer)
→ eval함수를 통해서 문자열로 된 수식을 계산할 수 있었다.
(하지만 eval함수는 입력값을 100% 신뢰할 수 있는 경우가 아니면 보안상 위험하다.)
정규표현식과 eval함수를 사용해본 코드
from itertools import permutations
import re
def solution(expression):
answer = []
my_exp = re.split(r'(\D)', expression)
operator = set(re.findall(r'\D', expression))
for each_permut in list(permutations(operator)):
dup_exp = my_exp[:]
for op in each_permut:
while op in dup_exp:
loc = dup_exp.index(op)
dup_exp[loc-1] = str(eval(''.join(dup_exp[loc-1:loc+2])))
dup_exp = dup_exp[:loc] + dup_exp[loc+2:]
answer.append(abs(int(dup_exp[0])))
return max(answer)
반응형