코딩테스트

[프로그래머스][KAKAO_인턴][2020] 수식 최대화

pythaac 2021. 9. 6. 22:23
프로그래머스 코딩테스트 고득점 Kit의 문제입니다.

https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

문제

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

내가 작성한 코드

import re
from itertools import permutations

def solution(expression):
    answer = 0
    for op_order in permutations(["*", "+", "-"]):
        operands = list(map(int, re.findall("\d+", expression)))
        operator = re.findall("\D", expression)
        for crnt_op in op_order:
            crnt_operands = []
            crnt_operator = []
            if operands:
                crnt_operands.append(operands[0])
            for i in range(1, len(operands)):
                crnt_operands.append(operands[i])
                crnt_operator.append(operator[i-1])
                if crnt_operator[-1] == crnt_op:
                    two, one = crnt_operands.pop(), crnt_operands.pop()
                    op = crnt_operator.pop()
                    if op == "*":
                        crnt_operands.append(one*two)
                    elif op == "+":
                        crnt_operands.append(one+two)
                    elif op == "-":
                        crnt_operands.append(one-two)
            operands, operator = crnt_operands, crnt_operator

        answer = max(answer, abs(operands.pop()))

    return answer
  • 문자열 연산
    • 연산자와 피연산자 분리
    • permutations으로 연산자 순서 조합 생성
    • stack에 삽입하면서 연산자 순서에 맞는 연산자일 경우 연산 후 삽입

 

다른 사람이 작성한 코드

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)
  • 프로그래머스에 올려둔 다른 분의 코드다
    • 연산자 순서에 따라 괄호를 오히려 추가한다
    • eval이라는 함수가 문자열 수식을 계산하는 것을 처음 봤다
      - 수식 뿐 만 아니라 command를 실행한다고 한다

 

기억해야할 것

  • regex를 이용하면 어렵지 않다고 생각하고 시작했는데, 계산 결과가 마이너스가 되면서 꼬였다
  • 위 방식도 expression을 loop마다 copy해서 마음에 들지 않는 방식이다