[프로그래머스] [카카오 인턴] 수식 최대화 (JS)

hhkim·2023년 10월 25일
0

Algorithm - JavaScript

목록 보기
165/188
post-thumbnail

풀이 과정

  1. 피연산자, 연산자를 배열로 분리: match()
  2. 연산자 우선 순위 배열 만들기: 재귀
  3. 연산자 우선 순위 배열에 대해 반복: 2중 for문
  4. 1번 배열에서 해당 연산자가 없어질 때까지 반복
  5. 각 연산자 인덱스의 피연산자는 i - 1과 i + 1번째
    계산 후 배열에 다시 넣기: splice()
  6. 계산 결과의 절댓값을 최댓값과 비교

코드

function solution(expression) {
  const arr = expression.match(/\d+|[*+-]/g);
  const priors = [];
  const recursion = (src, len, str) => {
    if (len === 0) {
      priors.push(str);
      return;
    }
    for (let i = 0; i < src.length; ++i) {
      recursion(src.replace(src[i], ''), len - 1, str + src[i]);
    }
  };
  recursion('+-*', 3, '');

  let result = 0;
  for (const prior of priors) {
    const tmp = [...arr];
    for (const op of prior) {
      let i = tmp.indexOf(op);
      while (i >= 0) {
        tmp.splice(i - 1, 3, calc(tmp[i - 1], tmp[i + 1], op));
        i = tmp.indexOf(op);
      }
    }
    if (Math.abs(tmp[0]) > result) result = Math.abs(tmp[0]);
  }
  return result;
}

function calc(num1, num2, op) {
  const [n1, n2] = [num1, num2].map(Number);
  switch (op) {
    case '+':
      return n1 + n2;
    case '-':
      return n1 - n2;
    case '*':
      return n1 * n2;
  }
}

🦾

처음에 중위 연산 이런 것만 보고 트리를 만들어야 하나 고민만 하다가 결국 다른 사람의 풀이를 참고해서 풀었다.
문제를 많이 풀어보고 감을 익혀야 생각이 갇히지 않을 듯...

정규표현식도 점점 익숙해지고 있다. match()를 이런 식으로 쓴다는 걸 다시 한번 상기할 수 있었다.

0개의 댓글