본문 바로가기
코딩테스트

수식 최대화

by 느림보어른 2021. 6. 3.

문제풀이

from itertools import permutations
import re
import queue
import copy

def solution(expression):
    answer = 0
    ops = []
    
    q = []
    
    numbers = re.split("[-, +, *]", expression)
    expression = list(expression)
    for num in numbers:
        q.append(int(num))
        for op in expression[:]:
            if op in ['-', '+', '*']:
                ops.append(op)
                q.append(expression.pop(0))
                break
            else:
                expression.pop(0)
                
    ops = set(ops)            
    op_lists = list(permutations(ops, len(ops)))
    for op_list in op_lists:
        new_q = q[:]
        for op in op_list:
            qx = []
            while(len(new_q)>0):
                num_or_op = new_q.pop(0)
                if num_or_op == op:
                    if op == '-':
                        qx.append(qx.pop() - new_q.pop(0))
                    elif op == '+':
                        qx.append(qx.pop() + new_q.pop(0))
                    else:
                        qx.append(qx.pop() * new_q.pop(0))
                else:
                    qx.append(num_or_op)
            new_q = qx[:]
            if len(new_q) == 1:
                result = abs(new_q[0])
                if answer < result:
                    answer = result
            
                      
    return answer

알고리즘

Queue

이 문제에서 Queue를 활용했다. 두 개의 Queue를 만들고 하나의 Queue에는 수식을 저장하고 다른 Queue에는 이전 Queue에서 하나씩 검사해가면서 연산자 우선순위에 맞게 계산을 하고 저장한다. 이 과정을 반복하면서 가장 큰 값을 찾아낸다.

Queue는 리스트로 구현했다.

itertools.permutations(iterable, r=None)

permutation은 서로 다른 n개(iterable) 중 r개를 골라 순서를 고려해 나열한 경우의 수이다. 이를 순열이라고 한다.

 

eval()

다른 사람 풀이 중 eval함수를 사용한 좋은 예제가 있어 소개한다.

eval() 함수는 수식(문자열)을 입력받으면 해당 수식의 계산 결과를 반환한다.

예를 들어,

>>>x = 1
>>>eval('x+1')
2

출처

문제: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

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

programmers.co.kr

파이썬 자료구조와 알고리즘 - 미아 스타인 저/최길우 

Do it! 자료구조와 함께 배우는 알고리즘 입문 : 파이썬 편 - 시바타 보요 저/강민 역

'코딩테스트' 카테고리의 다른 글

예상 대진표  (0) 2021.06.03
실패율  (0) 2021.06.03
오픈채팅방  (0) 2021.06.01
게임 맵 최단거리  (0) 2021.06.01
3진법 뒤집기  (0) 2021.06.01