[프로그래머스] 수식 최대화 (split 정규화, eval)

쿼카쿼카·2023년 5월 1일
0

문제




코드

// 시간초과 내 풀이
function solution(expression) {
    const arr = ['+-*', '+*-', '-+*', '-*+', '*+-', '*-+'];
    let ans = 0;
    
    for(let x of arr) {
        let result = expression
        for(let a of x) {
            if(a === '+') {
                while(result.indexOf(a) + 1) {
                    result = result.replace(/\d{1,}\+(\d{1,})/, (t) => {
                        const [n1, n2] = t.split(a);
                        return `${+n1 + +n2}`;
                    })
                }
            }
            else if(a === '-') {
                while(result.indexOf(a) + 1) {
                    result = result.replace(/\d{1,}\-(\d{1,})/, (t) => {
                        const [n1, n2] = t.split(a);
                        return `${n1 - n2}`;
                    })
                }
            }
            else {
                while(result.indexOf(a) + 1) {
                    result = result.replace(/\d{1,}\*(\d{1,})/, (t) => {
                        const [n1, n2] = t.split(a);
                        return `${n1 * n2}`;
                    })
                }
            }
        }
        if(Math.abs(result) > ans) ans = Math.abs(result);
    }
    return ans
}

// 제대로 된 풀이
function solution(expression) {
    const arr = ['+-*', '+*-', '-+*', '-*+', '*+-', '*-+'];
    const ans = [];
    
    for(let x of arr) {
        const temp = expression.split(/(\D)/);
        for(let a of x) {
            while(temp.includes(a)) {
                const i = temp.indexOf(a);
                temp.splice(i-1, 3, eval(`${temp[i-1]}${a}${temp[i+1]}`));
            }
        }
        ans.push(Math.abs(temp[0]));
    }
    return Math.max(...ans)
}

split(/(\D)/)

  • \D는 숫자가 아닌 것들을 찾아요 근데 (\D)를 하니까 왜 잘 나오는지는 아직 모르겠어요....
  • 모르면 외워야죠^_^

문자열로 된 식을 계산해주는 eval

  • 우리가 찾아야할 연산자의 idx를 찾아요!
  • idx-1~idx+1까지 splice로 자르고 eval로 계산한 값을 넣어줘요!
  • 음수가 나오면 -에 걸리지 않냐구요? ['-100', '-', '200'] 형태로 저장이 돼서 문제 없어요!

참고 사이트

profile
쿼카에요

0개의 댓글