한 걸음씩 기록하며

[프로그래머스] 카카오 인턴 | 수식 최대화 본문

알고리즘 & 코딩테스트

[프로그래머스] 카카오 인턴 | 수식 최대화

Haksae 2022. 3. 21. 00:42

⛏ 문제 파악

  • 주어진 수식을, 연산자의 우선순위를 부여하여 가장 큰 값으로 만드는 문제 (절대값)
  • 순열 조합과 브루트 포스로 풀면 된다.

 

👉🏻  답안

import re
from itertools import permutations

def solution(expression):
    answer = 0

    operation_list = list()		#수식 안에 연산자들이 있는지 확인 (시간복잡도를 줄이기 위해)
    if '*' in expression:
        operation_list.append('*')
    if '+' in expression:
        operation_list.append('+')
    if '-' in expression:
        operation_list.append('-')

    operation_permutations = list(permutations(operation_list)) #수식 안에 있는 연산자들로 순열 조합 만들기
    expression = re.split('([^0-9])', expression) #연산자 기준으로 split

    for operation_permutation in operation_permutations: #연산자 순열에서 조합 하나씩 꺼내기
        copied_expression = expression[:]		#수식을 복사하기
        for operator in operation_permutation:	#연산자 조합을 하나씩 꺼내기
            while operator in copied_expression:	#해당 연산자가 나오지 않을 때까지 반복
                op_idx = copied_expression.index(operator)	#해당 연산자 index
                cal = str(									#eval을 통해서 연산자 앞뒤의 숫자와 연산
                    eval(copied_expression[op_idx - 1] + copied_expression[op_idx] + copied_expression[op_idx + 1])
                )

                copied_expression[op_idx - 1] = cal			#연산자 index -1을 계산된 값으로 대체
                copied_expression = copied_expression[:op_idx] + copied_expression[op_idx + 2:] #계산된 수식을 삭제하여 붙임

        answer = max(answer, abs((int(copied_expression[0])))) #값을 절대값으로 바꾸고 최대값을 answer에 넣기

    return answer

📑  설명

  • 위의 자세하게 적었으니 여기서는 간단하게 적겠다.
  • 수식 안에 있는 연산자들로 조합을 만들고, 연산자 기준으로 정규식을 통해서 split 한다.
  • 연산자 순열에서 조합을 꺼내서, 해당 연산자의 앞뒤 숫자를 eval로 계산해준다.
  • 마지막으로 절대값 처리하고, 최대값을 answer에 넣고, 맨 끝에 이것을 출력해줘서 브루트 포스를 마친다.
Comments