수식 최대화 - 2020 카카오 인턴십 문제 (python, javascript)

SeoYng·2020년 8월 9일
2
post-custom-banner

프로그래머스, 2020 카카오 인턴십 코딩테스트 기출 - 수식 최대화 LV2

https://programmers.co.kr/learn/courses/30/lessons/67257
정규식과 eval사용, 잘못 삽질하면 오래걸리는 문제

👀 깃헙 소스

입출력 예
"100-200*300-500+20" =====>>> 60420

예시 설명
* > + > - 로 연산자 우선순위를 정했을 때, 가장 큰 절댓값을 얻을 수 있습니다.
연산 순서는 아래와 같습니다.
100-200300-500+20
= 100-(200
300)-500+20
= 100-60000-(500+20)
= (100-60000)-520
= (-59900-520)
= -60420
따라서, 우승 시 받을 수 있는 상금은 |-60420| = 60420 입니다.

코드

# 파이썬

from itertools import permutations
import re

def solution(expression):
    expressions = set(re.findall("\D", expression))
    prior = permutations(expressions)
    cand = []

    for op_cand in prior:
        temp = re.compile("(\D)").split('' + expression)
        for exp in op_cand:
            while exp in temp:
                idx = temp.index(exp)
                temp = temp[:idx-1] + [str(eval(''.join(temp[idx-1:idx+2])))] + temp[idx+2:]
        cand.append(abs(int(temp[0])))
    return max(cand)

// 자바스크립트
function solution(expression) {
    const prior = [
        ['-', '*', '+'],
        ['-', '+', '*'],
        ['*', '-', '+'],
        ['*', '+', '-'],
        ['+', '-', '*'],
        ['+', '*', '-']
    ]
    let cand = []

    for (let opCand of prior) {
        const temp = expression.split(/(\D)/)
        for (let exp of opCand) {
            while (temp.includes(exp)) {
                const idx = temp.indexOf(exp)
                temp.splice(idx - 1, 3, eval(temp.slice(idx - 1, idx + 2).join('')))
            }
        }
        cand.push(Math.abs(temp[0]))
    }
    return Math.max(...cand)
}
profile
Junior Web FE Developer
post-custom-banner

3개의 댓글

comment-user-thumbnail
2021년 7월 1일

언니... 다른 풀이보다가 언니꺼 봤는데 엄청 짧다 ㅠㅠ대박쓰 덕분에 정규 표현식 공부중..❤

1개의 답글
comment-user-thumbnail
2022년 6월 23일

우선 감사합니다 ! 정말 좋은 풀이 방법인 것 같아요 !

궁금한 점이 있는데

  • expression.split(/(\D)/);
  • expression.split(/\D/);

차이가 뭔가요 혹시 ,, 그룹짓는다 정도만 알것 같은데 혹시 설명해 주실 수 있을까요?

답글 달기