백준 14888 연산자 끼워넣기

bkboy·2022년 6월 13일
0

백준 중급

목록 보기
3/31

문제

제한 사항

입출력 예

풀이

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const sol = (input) => {
  const N = +input[0];
  const numbers = input[1].split(" ").map(Number);
  const operator = input[2].split(" ").map(Number);
  const operObj = {
    0: (oper1, oper2) => oper1 + oper2,
    1: (oper1, oper2) => oper1 - oper2,
    2: (oper1, oper2) => oper1 * oper2,
    3: (oper1, oper2) => {
      if (oper1 < 0) {
        return -Math.floor(-oper1 / oper2);
      }
      return Math.floor(oper1 / oper2);
    }, // operObj 객체에 순차적으로 덧셈, 뺄셈, 곱셈, 나눗셈을 선언해둔다.
  };

  let min = Number.MAX_SAFE_INTEGER;
  let max = Number.MIN_SAFE_INTEGER;

  const tmp = [];
  const dfs = (L) => {
    if (L === N - 1) {
      let sum = numbers[0];
      for (let i = 0; i < tmp.length; i++) {
        let next = numbers[i + 1];
        sum = operObj[tmp[i]](sum, next);
      }
      if (sum > max) max = sum;
      if (sum < min) min = sum;
    } else {
      for (let i = 0; i < 4; i++) {
        if (!operator[i]) continue;
        operator[i]--;
        tmp.push(i);
        dfs(L + 1);
        operator[i]++;
        tmp.pop();
      }
    }
  };
  dfs(0);

  return [max, min].join("\n");
};

console.log(sol(input));
  • 테스트 케이스는 다 맞았는데 정답이 안돼서 다른 사람의 코드를 참고해서 풀었다.
  • 연산자의 개수만큼 백트래킹을 해서 값을 누적하는 방식을 사용했는데, 위 코드는 백트래킹으로 사용할 연산자를 누적하고 마지막에 값을 내는 방식이다.
  • operObj 키 값에 따라 연산자가 주어지고 그 키 값으로 쓰일 수들을 tmp배열에 누적해준것이다.
  • object의 새로운 방식을 알았다. 객체의 value에 화살표 함수를 넣은 것이다.
  const operation = (oper, x, y) => {
    if (oper === "+") {
      return x + y;
    } else if (oper === "-") {
      return x - y;
    } else if (oper === "*") {
      return x * y;
    } else {
      if (x < 0) {
        return -Math.floor(-x / y);
      } else {
        return Math.floor(x / y);
      }
    }
  };

연산자를 받아서 다른 방식으로 처리했다.

profile
음악하는 개발자

0개의 댓글