[알고리즘] [카카오 인턴] 수식 최대화

sith-call.dev·2023년 7월 8일
0

알고리즘

목록 보기
33/47

문제

문제 링크

코드

from itertools import permutations as pm
import copy

def calculate(ops, expression):
    # print(f"ops = {ops}")
    # parsing
    numbers = set(map(str,range(10)))
    lst = list(expression)
    expression = []
    temp = []
    for cell in lst:
        if cell in numbers:
            temp.append(cell)
        else:
            expression.append(''.join(temp))
            expression.append(cell)
            temp = []
    expression.append(''.join(temp))
    
    # 우선 순위에 맞게 연산하기
    for op in ops:
        # print(f"op == {op}")
        while op in expression:
            # print(f"start! expression = {expression}")
            for i, cell in enumerate(expression):
                if cell == op:
                    # print(f"state = {i} {op} {cell}")
                    # print(f"expression = {expression}")
                    expression[i] = ''.join([expression[i-1],expression[i],expression[i+1]])
                    expression[i] = str(eval(expression[i]))
                    del expression[i+1]
                    del expression[i-1]
                    break
    return abs(int(expression[0]))
            

def solution(expression):
    result = []
    numbers = set(map(str,range(10)))
    ops = [x for x in list(expression) if x not in numbers]
    ops = set(ops)
    ops_priority = list(pm(list(ops), len(ops)))
    for ops in ops_priority:
        result.append(calculate(ops,expression))
    return max(result)
    

분석

접근법

전형적인 카카오 구현 문제 스타일이다.
카카오 구현 문제는 첫 번째로 문제 해석이 중요하다. 왜냐하면 문제 자체의 조건이 복잡하다. 그래서 이것을 꼼꼼히 찢어서 구현하기 쉬운 상태로 만들어야 한다. 그리고 분석을 바탕으로 차분하게 구현하면 끝이다.

해설

  1. 주어진 입력값의 크기가 작다.
    -> 이것은 구현의 난이도를 높여놨음을 뜻한다.
    -> 왜냐하면 시간 복잡도로부터 자유롭게 풀어도 되기 때문이다.
  2. 문제 분석
    1. 수식에서 연산자를 뽑아낸다.
    2. 연산자들에 순서를 부여해서 우선순위를 나타나게 한다.
    3. 모든 연산자들의 우선순위의 경우를 만든다. (그래봤자 6!)
    4. 우선순위를 바탕으로 수식을 계산하는 함수를 만든다.
      1. 반복문을 통해서 모든 연산을 처리할 수 있도록 한다.
      2. 즉, 하나의 연산을 주었을 때 딱 그 연산만 먼저 계산하고 나머지 수식은 유지할 수 있도록 만든다.
      3. 첫 번째로 특정한 연산을 만났을 때 좌항과 우항을 통해 값을 계산한 뒤, 그 값을 해당 인덱스의 데이터와 변경시킨다.
      4. 그리고 좌우의 데이터를 삭제한다. (좌항, 우항 제거)
      5. 만약 아직도 특정했던 연산이 수식에 남아 있는 경우 처음부터 수식을 다시 탐색한다.
        1. 이는 좌항과 우항을 삭제하기 때문에 인덱스가 한 칸을 뛰어넘고 진행하기 때문에 아예 제어 흐름을 리셋시키는 행위다.
    5. 모든 우선순위의 경우의 수에서 값을 구한다.
    6. 값의 절댓값의 최댓값을 반환한다.
profile
lim (time → ∞) Life(time) = LOVE

0개의 댓글

관련 채용 정보