고딩왕 코범석

[프로그래머스] 수식 최대화, Python3 본문

Computer Science/Algorithm

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

고딩왕 코범석 2021. 1. 6. 11:43
반응형

이번 포스팅에서는 2020 카카오 인턴십 코딩테스트 문제 중 두 번째 문제인 수식 최대화 문제에 대해 풀이를 해볼 것이다.

  • 문제 설명

image

  • 제한 사항

image

  • 테스트케이스

image

우선 나는 이 문제를 어떻게 풀지 몰라 감이 안잡혀 다른 분의 코드를 참조했다.거의 베낀 것이나 다를바 없다


그치만 코드를 하나씩 살펴보면서 재귀에 대한 이해, 재귀를 사용할 때 코드의 간결함을 보고 많이 배운 코드였다.

  • 풀이 방법
    1. priorities 라는 배열을 선언했다. 이곳에는 연산자들의 우선순위를 담아두었다.
    2. priorities에 있는 우선순위들을 하나씩 대입하여 해당 연산의 결과를 얻어낸다.
    3. 연산 결과를 절댓값으로 바꾸어 최댓값을 비교하고 정답을 리턴한다.
def get_result(n, priority, expression):
    if n == 2:
        return str(eval(expression))

    if priority[n] == '*':
        result = eval('*'.join([get_result(n + 1, priority, e) for e in expression.split('*')]))
    if priority[n] == '+':
        result = eval('+'.join([get_result(n + 1, priority, e) for e in expression.split('+')]))
    if priority[n] == '-':
        result = eval('-'.join([get_result(n + 1, priority, e) for e in expression.split('-')]))

    return str(result)


def solution(expression):
    answer = 0
    priorities = [
        ('*', '+', '-'),
        ('*', '-', '+'),
        ('+', '-', '*'),
        ('+', '*', '-'),
        ('-', '+', '*'),
        ('-', '*', '+')
    ]

    for priority in priorities:
        result = get_result(0, priority, expression)
        answer = max(answer, abs(int(result)))
    return answer

풀이 방법은 무슨 범접할 수 없는 세계관을 가진거 마냥 쉽게 써놨는데 재귀에 대한 이해, eval의 활용이 까다로워서 작성된 코드의 get_result를 세세하게 풀어보려고 한다.

def get_result(n, priority, expression):
    if n == 2:
        return str(eval(expression))

    if priority[n] == '*':
        result = eval('*'.join([get_result(n + 1, priority, e) for e in expression.split('*')]))
    if priority[n] == '+':
        result = eval('+'.join([get_result(n + 1, priority, e) for e in expression.split('+')]))
    if priority[n] == '-':
        result = eval('-'.join([get_result(n + 1, priority, e) for e in expression.split('-')]))

    return str(result)

먼저 문제 설명에서 주어진 Expression = "100-200*300-500+20", 연산자의 우선 순위가 +, -, * 일 경우 22,000원이 나오는 과정을 보겠다.

image

이러한 과정속에 22,000 이라는 결과가 나오며 문제 설명의 연산자 우선순위와 반대가 되어있다.

그 이유는 맨 앞의 우선순위를 가진 연산자를 제일 먼저 계산해줘야한다. n == 2 조건이 결국 남은 연산자를 eval 함수를 활용하여 연산이 수행되는 것이고 n==0, 1 일때는 연산을 미룬 것이다.

이말을 다시 말하면 연산의 우선순위의 역순으로 일단 split 해준다. n==2 일때는 연산을 수행해줘야 하므로 이 때 연산되는 연산자가 연산의 우선순위가 첫번째를 기준으로 연산 되는것이다.

오늘은 그럼 여기까지! 피드백 및 댓글은 환영합니당ㅎㅎㅎ

반응형