Coding Test/프로그래머스(Python)
[프로그래머스/Python] Level 2_수식 최대화 (2020 카카오 인턴십)
syunze
2023. 9. 6. 17:08
📌문제 유형
2020 카카오 인턴십 (구현)
📌문제
📌나의 문제풀이
- list_에 숫자, 연산자 분리해서 저장
- 우선 연산자부터 계산해서 값 갱신
from copy import deepcopy
def solution(expression):
answer = 0
prior = [('+','-','*'), ('+','*','-'), ('*','-','+'),
('*','+','-'), ('-','*','+'), ('-','+','*')]
list_ = []
# 숫자, 연산자 분리해서 list_에 한 번에 저장
num = ''
for s in range(len(expression)):
if expression[s] not in ['+','-','*']:
num += expression[s]
else:
list_.append(int(num))
num = ''
list_.append(expression[s])
if s == len(expression)-1:
list_.append(int(num))
# 우선순위 저장해 놓은거 검토
for i in range(6):
nums_copy = deepcopy(list_)
# nums_copy 개수가 1개 될 때까지 반복
while True:
if len(nums_copy) == 1:
break
# 우선순위 3개 항목 차례대로 검증
for j in range(3):
flag = -1 # while문 반복여부 판단. flag = 0이면 해당 연산자 계산 끝. flag = 1이면 해당 연산자 남아있음
# 직접 계산하면서 nums_copy 1개로 줄이기
while True:
if flag == 0:
break
for k in range(len(nums_copy)):
if nums_copy[k] == prior[i][j]:
if nums_copy[k] == '+':
nums_copy[k-1] = nums_copy[k-1] + nums_copy[k+1]
elif nums_copy[k] == '-':
nums_copy[k-1] = nums_copy[k-1] - nums_copy[k+1]
else:
nums_copy[k-1] = nums_copy[k-1] * nums_copy[k+1]
nums_copy = nums_copy[:k] + nums_copy[k+2:]
flag = 1
break
flag = 0
# 음수인 경우, 양수로 바꾸기
if nums_copy[0] < 0:
nums_copy[0] = abs(nums_copy[0])
# 가장 큰 값 저장
if nums_copy[0] > answer:
answer = nums_copy[0]
return answer
📌다른 사람의 문제풀이
- split과 join활용, DFS 사용
- 가장 우선적인 연산자 기준으로 split 사용
- 다시 calc로 계산, 내부의 값 생성 후 우선 연산자로 join
from itertools import permutations
def calc(priority, n, expression):
if n == 2:
return str(eval(expression))
if priority[n] == '*':
res = eval('*'.join([calc(priority, n + 1, e) for e in expression.split('*')]))
if priority[n] == '+':
res = eval('+'.join([calc(priority, n + 1, e) for e in expression.split('+')]))
if priority[n] == '-':
res = eval('-'.join([calc(priority, n + 1, e) for e in expression.split('-')]))
return str(res)
def solution(expression):
answer = 0
priorities = (list(permutations(['*','-','+'], 3)))
for priority in priorities:
res = int(calc(priority, 0, expression))
answer = max(answer, abs(res))
return answer
- 잘 이해 안가는 코드
def solution(expression):
operations = [('+', '-', '*'),('+', '*', '-'),('-', '+', '*'),('-', '*', '+'),('*', '+', '-'),('*', '-', '+')]
answer = []
for op in operations:
a = op[0]
b = op[1]
temp_list = []
for e in expression.split(a):
temp = [f"({i})" for i in e.split(b)]
temp_list.append(f'({b.join(temp)})')
answer.append(abs(eval(a.join(temp_list))))
return max(answer)
📌리뷰
- 복잡한 연산식은 join, split으로 계산 가능
- 연산식을 숫자, 연산자로 구분해서 리스트 생성하면 접근하기 쉬움
728x90