Algorithm

[JavaScript] 백준 14888. 연산자 끼워넣기

합주기 2025. 4. 8. 00:09

문제 설명

입력 예시

- 2개의 숫자 5, 6이 주어짐

- 연산자 순서대로 +, -, x, ÷ 이 개수를 나타내며, 곱셈을 한개 가지고 있음을 의미

2
5 6
0 0 1 0

 

숫자 사이의 연산자를 원하는 대로 조합하여 구할 수 있는 결과값 중 가장 큰 값과 가장 작은 값을 리턴하는 문제이다.

 

문제 풀이

N <= 11이고, 사칙연산은 4종류이므로 아무리 많아봤자 4^11을 넘지 못한다.

이는 1초에 해당하는 1억번의 연산보다 적은 수이므로 모든 조합을 구한다, 즉 백트래킹 문제이다.

 

우선 사칙 연산의 결과를 리턴하는 함수를 별도로 분리했다.

function getResult(a, b, opNum) {
  if (opNum === 0) return a + b;
  else if (opNum === 1) return a - b;
  else if (opNum === 2) return a * b;
  else {
    return parseInt(a / b);
  }
}

 

백트래킹 함수를 구현했다.

백트래킹 함수에서 가장 중요한 것은 종료 조건, 그리고 for 반복문이다.

1) 종료 조건 : N이 되는 경우, 최대 최소 결과값을 업데이트

2) for 반복문 : 4칙연산에 대하여, 하나를 선택 후 이 연산자가 남아있다면 다음 함수 진행

function bt(idx, result) {
  if (idx === N) {
    minResult = Math.min(minResult, result);
    maxResult = Math.max(maxResult, result);
    return;
  }

  for (let opNum = 0; opNum < 4; opNum++) {
    if (op[opNum]) {
      op[opNum]--;
      bt(idx + 1, getResult(result, numbers[idx], opNum));
      op[opNum]++;
    }
  }
}

 

전체 코드

코드를 보여주기 전에, 짚고 넘어갈 게 있다.

자바스크립트는 +0과 -0을 구분한다. 
예를 들어, 0 * -1 = 0이 아닌 -0이다.

 

따라서 getResult() 함수의 리턴값으로 -0이 나올 수 있으며 그 결과 maxResult, minResult가 -0이 될 수 있다.

이를 보완하기 위해 maxResult ? maxResult : 0 코드를 작성했다.

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf8").trim().split("\n");

const N = Number(input[0]);
const numbers = input[1].split(" ").map(Number);
let op = input[2].split(" ").map(Number);

let minResult = Infinity;
let maxResult = -Infinity;
bt(1, numbers[0]);
console.log(maxResult ? maxResult : 0);
console.log(minResult ? minResult : 0);

function bt(idx, result) {
  if (idx === N) {
    minResult = Math.min(minResult, result);
    maxResult = Math.max(maxResult, result);
    return;
  }

  for (let opNum = 0; opNum < 4; opNum++) {
    if (op[opNum]) {
      op[opNum]--;
      bt(idx + 1, getResult(result, numbers[idx], opNum));
      op[opNum]++;
    }
  }
}

function getResult(a, b, opNum) {
  if (opNum === 0) return a + b;
  else if (opNum === 1) return a - b;
  else if (opNum === 2) return a * b;
  else {
    return parseInt(a / b);
  }
}

'Algorithm' 카테고리의 다른 글

[JavaScript] 백준 12933. 오리  (1) 2025.04.11
[JavaScript] 백준 2294. 동전2  (0) 2025.04.02
[JavaScript] 12904. A와 B  (1) 2025.03.27
[JavaScript] 1446. 지름길  (1) 2025.03.26
[JavaScript] 구간 합 구하기 5  (1) 2025.03.21