본문 바로가기

코테연습문제

[Programmers/Python] 수식 최대화

import itertools

def solution(expression):
    answer = []
    operators = ['+', '-', '*']
    operatorPerm = list(itertools.permutations(operators, 3)) # 풀이과정 1

    for operator in operatorPerm:
        op1 = operator[0]
        op2 = operator[1]
        partLst = []
        for i in expression.split(op1): # 풀이과정 2
            part = []
            for j in i.split(op2):
                part.append(f'({j})') # 풀이과정 3
            partLst.append(f'({op2.join(part)})') # 풀이과정 4
        answer.append(abs(eval(op1.join(partLst)))) # 풀이과정 5
        result = max(answer) # 풀이과정 6
        
    return result

유의했던 사항

1. 연산자는 +, -, * 만 사용

2. 기존의 연산 우선순위를 무시해야함

 

풀이과정

1. ' +, -, * '로 permutation(순열)을 구해 리스트 만들기

2. 연산자 순열 리스트를 하나씩 돌면서 첫 번째 연산자를 기준으로 split

3. 첫 번째 연산자를 기준으로 split한 것들을 다시 돌면서 두 번째 연산자를 기준으로 split해서 각각을 ( ) 처리

4. 3에서 얻은 것들을 두 번째 연산자로 join해서 append

5. 4에서 얻은 리스트를 첫 번째 연산자로 join해서 append → 모든 연산 수행 후 절댓값

6. 5에서 얻은 리스트 중 max값 return

 

알게된 것

1. eval( ):  식을 문자열로 받아서 실행하는 함수

    → 식이 문자열로 주어져야 하는데, 이 문제의 경우 expression이 문자열로 주어져서 사용하게 되었다.

2. f'({})' : { }안에 있는 문자열(변수, 함수 호출 결과)을 보여주는데, ' ' 안에만 있으면 { } 밖에 있는 모든 문자들이 { } 안에 있는 문자열과 함께 보여지게 된다.

    → 이 문제의 경우, ( )로 split된 식을 감싸게 되어서 나중에 연산을 할 때 우선순위를 부여해줄 수 있었다.

    → 개인적으로 f-string을 자주 사용하지 않아서 어색한 문법인데 앞으로 자주 사용해서 익숙해져야겠다. 문자열 포맷팅 하기에 아주 유용하다.


-) 흐름을 생각하는 것이 어려웠다. (f-string으로 ( ) 처리를 해서 연산의 우선순위를 부여해주는 것으로 해결)

 

+) permutation을 사용해 가능한 모든 연산자의 우선순위를 정할 수 있었다.