백준 14888번: 연산자 끼워넣기[JS]

Song-Minhyung·2022년 10월 6일
0

Problem Solving

목록 보기
19/50
post-thumbnail

문제

https://www.acmicpc.net/problem/14888

N이면서, 길이가 적어도 L인 가장 짧은 연속된 음이 아닌 정수 리스트를 구해라!

입력

  • 첫째줄: 수의 개수 N
    • N은 2이상 11이하의 자연수
  • 둘째줄: 자연수가 N개 주어진다.
  • 셋째줄: 합이 N-1인 4개의 정수가 주어진다. 차례대로 +, -, *, / 의 개수다.

출력

  • 첫째줄에는 만들 수 있는 식의 최댓값을, 둘째줄에는 최솟값을 출력한다.

문제풀이

문제를 보자마자 재귀로 간단하게 풀면 될것같다고 생각했다.
이유는 재귀함수 스택이 많아봐야 수의 개수 최대치인 11이었기 때문이다.
자세한 방법은 재귀함수로 기호의 순서를 구한후 기호의 갯수가 N-1개가 되면 그때
계산을 실시한다. 그리고 그 결과를 min, max와 비교하고 마지막에 결과를 출력한다.

const stdin = (
  process.platform === "linux"
    ? require("fs").readFileSync(0, "utf-8")
    : `
2
5 6
0 0 1 0
`
)
  .trim()
  .split("\n");
const input = (() => {
  let line = 0;
  return () => stdin[line++].split(" ").map((v) => +v);
})();

const N = +input();
const nums = input();
const cals = input();

let min = Infinity;
let max = -Infinity;

const calculateSum = (arr) => {
  let sum = nums[0];

  for (let i = 1; i < N; i++) {
    const sign = arr[i - 1];

    if (sign === 0) sum += nums[i];
    else if (sign === 1) sum -= nums[i];
    else if (sign === 2) sum *= nums[i];
    // 음수 / 양수 : 양수로 바뀐뒤 몫 취하고 음수로 바꿈
    else {
      if (sum < 0) {
        sum = Math.floor(Math.abs(sum) / nums[i]) * -1;
      } else {
        sum = Math.floor(sum / nums[i]);
      }
    }
  }
  return sum;
};
  
const getPermutation = (arr, op) => {
  if (arr.length === N - 1) {
    const sum = calculateSum(arr);
    min = Math.min(min, sum);
    max = Math.max(max, sum);
    return;
  }
  for (let i = 0; i < 4; i++) {
    if (op[i] === 0) continue;
    const newOp = [...op];
    newOp[i]--;
    getPermutation([...arr, i], newOp);
  }
};

getPermutation([], cals);
console.log(`${max}\n${min}`);
profile
기록하는 블로그

0개의 댓글