Coding Test/프로그래머스(Python)

[프로그래머스/Python] Level 2_수식 최대화 (2020 카카오 인턴십)

syunze 2023. 9. 6. 17:08

📌문제 유형

2020 카카오 인턴십 (구현)

 

📌문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌나의 문제풀이

- 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