ror_coding

[Programmers] [카카오 인턴] 수식 최대화 - 67257 본문

Algorithm/Python

[Programmers] [카카오 인턴] 수식 최대화 - 67257

ro_rdil_31 2025. 1. 19. 16:32
728x90
728x90

eval을 이용해서 연산 !

 

Question

 

수식에 연산자가 3개 주어졌으므로 가능한 연산자 우선순위 조합은 3! = 6가지이며, 그 중 + > - > * 로 연산자 우선순위를 정한다면 결괏값은 22,000원이 됩니다.
반면에 * > + > - 로 연산자 우선순위를 정한다면 수식의 결괏값은 -60,420 이지만, 규칙에 따라 우승 시 상금은 절댓값인 60,420원이 됩니다.
참가자에게 주어진 연산 수식이 담긴 문자열 expression이 매개변수로 주어질 때, 우승 시 받을 수 있는 가장 큰 상금 금액을 return 하도록 solution 함수를 완성해주세요.

[제한사항]
  • expression은 길이가 3 이상 100 이하인 문자열입니다.
  • expression은 공백문자, 괄호문자 없이 오로지 숫자와 3가지의 연산자(+, -, *) 만으로 이루어진 올바른 중위표기법(연산의 두 대상 사이에 연산기호를 사용하는 방식)으로 표현된 연산식입니다. 잘못된 연산식은 입력으로 주어지지 않습니다.
    • 즉, "402+-561*"처럼 잘못된 수식은 올바른 중위표기법이 아니므로 주어지지 않습니다.
  • expression의 피연산자(operand)는 0 이상 999 이하의 숫자입니다.
    • 즉, "100-2145*458+12"처럼 999를 초과하는 피연산자가 포함된 수식은 입력으로 주어지지 않습니다.
    • "-56+100"처럼 피연산자가 음수인 수식도 입력으로 주어지지 않습니다.
  • expression은 적어도 1개 이상의 연산자를 포함하고 있습니다.
  • 연산자 우선순위를 어떻게 적용하더라도, expression의 중간 계산값과 최종 결괏값은 절댓값이 263 - 1 이하가 되도록 입력이 주어집니다.
  • 같은 연산자끼리는 앞에 있는 것의 우선순위가 더 높습니다.

 

Point

 

  • operations 6가지 경우의 수를 미리 선언해줍니다. 그렇게 되면 피연산자가 2개일 때도 오류 없이 진행이 가능합니다. (split을 사용하기 때문에 존재하지 않는 피연산자라면 split 없이 원래 값이 return 되기 때문입니다.)
  • 이때 피연산자 a -> b  순서대로 split을 하기 때문에, 실제 연산되는 순서는 c -> b -> a 입니다.
    • 우선 연산을 위해 split 할 때 ( ) 괄호를 붙여 우선 연산자로 만듭니다.

 

Code

 

def solution(expression):
    answer = []
    operations = [('-','+','*'),('-','*','+'),('+','-','*'),('+','*','-'),('*','+','-'),('*','-','+')]
    for a,b,c in operations:
        lst = []
        for e in expression.split(a):
            tmp = [ f'({i})' for i in e.split(b) ]
            lst.append( f'({b.join(tmp)})')
        answer.append(abs(eval(f'{a.join(lst)}')))
            
    return max(answer)

 

now me

On my github
728x90