본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] 수식 최대화

/  구현 1  /

 

from itertools import permutations
def calculate(a, b, oper):
    if oper == '*':
        return a*b
    elif oper == '+':
        return a+b
    elif oper == '-':
        return a-b
def solution(expression):
    answer = 0
    nums = []
    opers = []
    num = ''
    for ex in expression:
        if ex == "*" or ex == "+" or ex == "-":
            opers.append(ex)
            nums.append(num)
            num = ''
        else:
            num += ex
            
    oper_order = list(permutations(['-','*','+'],3))
    print(oper_order)
    sum = 0
    for order in oper_order: # 각 우선순위정하기 후보마다
        now_sum = 0
        temp = []
        nums_cp = nums
        for o in opers: # 우선순위 순서대로 관련 값 계산 / 관련 없으면 그냥 넣고 다음 순서에서 계산하도록
            if o == order: # 이번이 이 연산자 계산 순서야. 앞뒤애 계산해서 넣기
                temp.append(calculate(nums_cp[opers.index(o), nums_cp[opers.index(o)+1, o]]))
            else:
                temp.append(nums_cp[opers.index(o)])
            nums_cp = temp
    print(nums, opers)
    return answer

 

index error로 제출도 안 한 코드입니다. 실패는 성공의 어머니라고.. 그냥 기록용으로 남깁니다.

 

사실 아이디어 자체가 아예 망하지는 않았는데 미세한 부분에서 구현을 더 복잡하게 만들어버려서 망한 것 같습니다.

 

코딩 테스트 레벨은 각 단계마다 트레드밀이 있어서 어느 정도 범주에 올라서 다음 계단을 밟지 않으면 실력이 쭉 미끄러지는 것 같습니다. 다 아는 개념인데도 머릿 속으로 정리가 안 되어서 구현도 못 하게 됩니다. 억.. 울해.. 뭐 어쩌겠나요. 계속 반복해서 다음 계단으로 올리는 수밖에.. 누가 안 올려주니까 !

 


/  제출 1  /

from itertools import permutations
from collections import deque


def solution(expression):
    answer = 0
    for priority in list(permutations(['+', '-', '*'], 3)):
        answer = max(answer, abs(make_result(priority, expression)))
    return answer


def make_result(priority, expression):
    # arr 만들기
    array = deque()
    num = ''
    for k in expression:
        if k.isdigit():
            num += k
        else:
            array.append(num)
            num = ''
            array.append(k)
    array.append(num)
    
    for op in priority:
        stack = []
        while len(array) != 0:
            temp = array.popleft()
            if temp == op:
                result = calculate(int(stack.pop()), int(array.popleft()), op)
                stack.append(result)
            else:
                stack.append(temp)
        array = deque(stack)
    return int(array.pop())

def calculate(a, b, oper):
    if oper == '*':
        return a*b
    elif oper == '+':
        return a+b
    elif oper == '-':
        return a-b

 

다른 분이 하신 코드를 2번 손코딩 한 뒤에 작성한 코드입니다.

 

길어지니 기능 사항이 눈에 잘 안 들어와서 함수로 좀 쪼갰습니다. 길이는 길지만 코드 자체는 이해하기 쉬울 것 같습니다.

 

제가 첫 구현에서 아차 싶었던 부분이 스택으로 계산 값들을 업데이트해주는 것이었습니다.

 

스택으로 만들어 계산하면 그 다음에 새 배열을 다시 선언해야 하나 그러면 너무 복잡하니 큐로 계속 해야겠다 싶었는데,

 

스택 + 데크를 적절히 섞어 사용하는 것이 답이었습니다. 

 

사실 해당 구현은 비슷한 문제를 풀어본 적이 있는 걸 보니 경험과 반복이었으면 쉽게 해냈을텐데 아쉬움이 컸습니다.

 

어떤 문제에도 적용될 당연한 말이죠 뭐..

 

 

 

하여간 문제 푸는 감을 다시 끌어올린 느낌이 들어서 풀면서 재밌었던 문제였습니다.