문제 설명

https://programmers.co.kr/learn/courses/30/lessons/67257

답안

나의 풀이

function solution(expression) {
  const priorities = [
    ["*", "+", "-"],
    ["*", "-", "+"],
    ["+", "*", "-"],
    ["+", "-", "*"],
    ["-", "*", "+"],
    ["-", "+", "*"],
  ];
  const calc = {
    "*": (num1, num2) => num1 * num2,
    "+": (num1, num2) => num1 + num2,
    "-": (num1, num2) => num1 - num2,
  };
  let nums = expression.split(/\D/).map((str) => Number(str));
  let signs = expression.replace(/\d/gi, "").split("");

  const answers = priorities.map((priority) => {
    const nums2 = nums.slice();
    const signs2 = signs.slice();
    priority.forEach((sign) => {
      for (let idx = 0; idx < signs2.length; idx++) {
        if (sign !== signs2[idx]) continue;
        const result = calc[signs2[idx]](nums2[idx], nums2[idx + 1]);
        nums2.splice(idx, 2, result);
        signs2.splice(idx, 1);
        idx--;
      }
    });
    return Math.abs(nums2[0]);
  });

  return Math.max(...answers);
}

시간복잡도: O(N3)

  1. 우선 순위 별로 나올 수 있는 경우 6가지를 구한다.
  2. 우선 순위 배열을 반복문을 돌며 해당 우선 순위로 계산할 때 나오는 값들을 각각 구한다.
  3. 정규식을 이용하여 숫자만 적힌 배열과 연산자만 적힌 배열을 구한다.
  4. 연산을 한번 할 때마다 숫자 배열과 연산자 배열에서 숫자와 연산을 splice해줘야하므로 두 배열을 slice한다.
  5. slice한 연산자 배열(signs2)에서 우선 순위 배열(priorty)에 연산자와 값이 같을 경우
    해당 연산자 idx에 해당하는 숫자 배열(nums2)에 idx와 idx+1 두 숫자를 calc를 통해서 계산하여 result에 담는다.
  6. nums2 배열에 splice를 통해 게산한 두 숫자를 삭제하고 result를 추가한다.
  7. signs2 배열에 splice를 통해 계산한 연산자를 삭제한다.
  8. 연산자 배열을 순회 중인데 하나를 삭제했으므로 idx–를 해준다.
  9. 모든 연산을 마치면 nums2는 최종 연산 결과를 담은 legnth가 1인 배열이 된다.
  10. 음수인 경우에는 절대값으로 계산해야하므로 Math.abs를 하여 반환해준다.
  11. 모든 우선 순위 경우에 해당하는 최종 연산 결과가 담은 answers 배열 중에서 Math.max를 사용하여 가장 큰 값을 반환한다.