한 걸음씩 기록하며
[프로그래머스] 카카오 인턴 | 수식 최대화 본문
⛏ 문제 파악
- 주어진 수식을, 연산자의 우선순위를 부여하여 가장 큰 값으로 만드는 문제 (절대값)
- 순열 조합과 브루트 포스로 풀면 된다.
👉🏻 답안
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에 넣고, 맨 끝에 이것을 출력해줘서 브루트 포스를 마친다.
'알고리즘 & 코딩테스트' 카테고리의 다른 글
[프로그래머스 SQL 테스트] 입양 시각 구하기(2) (0) | 2022.04.28 |
---|---|
[백준] 1010번 다리놓기 (0) | 2022.03.20 |
[백준] 2231번 분해합 (0) | 2022.03.20 |
[백준] 2798번 블랙잭 (0) | 2022.03.20 |
[Brute Force]란 무엇인가? (0) | 2022.03.20 |
Comments