반응형

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)

 

반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

경주로 건설  (0) 2021.02.08
보석 쇼핑  (0) 2021.02.08
키패드 누르기  (0) 2021.02.05
호텔 방 배정  (0) 2021.02.03
징검다리 건너기  (0) 2021.02.02

+ Recent posts