프로그래머스 - 수식 최대화

Hyebin·2021년 8월 13일
0

Data structure / Algorithm

목록 보기
18/19
post-thumbnail

연산자 우선 순위를 재정의해서 계산할 수 있는 가장 큰 값을 리턴하면 되는 문제이다.

자세한 문제 설명은 아래 링크로!
https://programmers.co.kr/learn/courses/30/lessons/67257

풀이

*,-,+로 만들 수 있는 우선순위는 6개이므로 경우의 수를 따로 구하지 않고 테이블을 만들어준다.

  • 우선순위 경우의 수 최대 6개 -> look-up table로 만들었다.
  • 우선순위 배열을 순회하면서 우선순위에 맞는 연산을 실행한 값을 result 배열에 넣는다.
  • 어떻게?
  • expression 배열을 숫자와 연산자로 나눈다.
  • 순위 배열의 요소도 배열이니깐 또 순회하면서
  • expression배열에서 연산자가 위치한 인덱스를 구해주고
  • 해당 인덱스를 기준으로 이전 값과 다음 값을 계산한다.
  • 업데이트 된 값을 다시 넣어줌
function solution(expression) {
    let result = []
    let table = [
        ['+', '-', '*'],
        ['+', '*', '-'],
        ['-', '+', '*'],
        ['-', '*', '+'],
        ['*', '+', '-'],
        ['*', '-', '+']
    ]
    //계산 함수 
    const cal = (num1, num2, op) => {
        if(op === '+') return Number(num1) + Number(num2)
        if(op === '-') return Number(num1) - Number(num2)
        if(op === '*') return Number(num1) * Number(num2)
    }
    
    table.forEach(arr => {  //['+', '-', '*']
        let nums = expression.split(/([-*+])/g) 
        //["100", "-", "200", "*", "300", "-", "500", "+", "20"]
        arr.forEach(oper => {  //'+'
            //연산자일 때만 
            while(nums.includes(oper)) {
                let idx = nums.indexOf(oper)
                //계산된 값으로 교체
                nums.splice(idx-1, 3, cal(nums[idx-1], nums[idx+1], oper))
            }
        })
        result.push(Math.abs(nums[0]))
    })
    return Math.max(...result)
    
}

0개의 댓글