사칙연산

Lv. 4

Solution

import { range } from '@algorithm/lib';
 
export function fourOperations(arr: string[]) {
  const nums: number[] = [];
  const operations: string[] = [];
  arr.forEach((value, i) => {
    if (i % 2 === 0) {
      nums.push(parseInt(value, 10));
    } else {
      operations.push(value);
    }
  });
 
  const operate = (a: [number, number], b: [number, number], op: string): [number, number] => {
    if (op === '+') {
      return [a[0] + b[0], a[1] + b[1]];
    }
    return [a[0] - b[1], a[1] - b[0]];
  };
 
  const n = nums.length;
  const dp: [number, number][][] = Array.from({ length: n }).map(() =>
    Array.from({ length: n }).map(() => [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]),
  );
 
  for (const i of range(n)) {
    dp[i][i] = [nums[i], nums[i]];
  }
 
  for (const k of range(1, n)) {
    for (const i of range(n - k)) {
      for (const j of range(i, i + k)) {
        const [maxValue, minValue] = operate(dp[i][j], dp[j + 1][i + k], operations[j]);
        dp[i][i + k][0] = Math.max(dp[i][i + k][0], maxValue);
        dp[i][i + k][1] = Math.min(dp[i][i + k][1], minValue);
      }
    }
  }
 
  return dp[0][n - 1][0];
}