새소식

Baekjoon

[BaekJoon] 14888번 연산자 끼워넣기 문제 - (nodejs)

  • -
728x90
문제 번호 :  14888번

문제 바로가기 ☞  https://www.acmicpc.net/problem/14888

 

<<< 문제 내용 >>>

 

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

// object function
const operObj = {
  "+": (oper1, oper2) => oper1 + oper2,
  "-": (oper1, oper2) => oper1 - oper2,
  "*": (oper1, oper2) => oper1 * oper2,
  "/": (oper1, oper2) => {
    if (oper1 < 0) {
      return -Math.floor(-oper1 / oper2);
    }
    return Math.floor(oper1 / oper2);
  },
};

// 백트래킹으로 여러가지 조합 가져오기
const comb = (count) => {
  if (count === 0) {
    tempOperate.push([...inArr]);
    return;
  }

  for (let i = 0; i < operator.length; i++) {
    if (visited[i] === 0) {
      visited[i] = 1;
      inArr.push(operator[i]);
      comb(count - 1);
      inArr.pop();
      visited[i] = 0;
    }
  }
};

let N = Number(input.shift());
let numArr = input[0].split(" ").map(Number);
let [plus, minus, multiple, divide] = input[1].split(" ").map(Number);
let operator = [];

// 함수로 만들자니 애매하게 작아서 그냥 다 적었음
// 이 부분을 개선하면 좋을텐데 방법이 안떠오름..
for (let i = 0; i < plus; i++) {
  operator.push("+");
}
for (let i = 0; i < minus; i++) {
  operator.push("-");
}
for (let i = 0; i < multiple; i++) {
  operator.push("*");
}
for (let i = 0; i < divide; i++) {
  operator.push("/");
}

// tempOperate는 백트래킹으로 여러가지 조합을 담는 변수
let tempOperate = [];
// 백트래킹 내 로직처리를 위한 변수
let inArr = [];
// 백트래킹 시 방문한 위치를 알기위한 변수
// 보통 true false로 사용함.
let visited = new Array(N - 1).fill(0);

comb(N - 1);

let result = [];

// 조합을 담아둔 변수 하나씩 체크하면서
// 연산자 개수만큼 for문을 열어서
// [1, 2, 3, 4, 5] 로 치면 1, 연산자, 2 순서로 계산할텐데
// 이 계산한 값을 2인 2번째 값에 계속해서 누적해서 저장하고
// 마지막에 누적된 값을 result에 넣어줌.
for (let i = 0; i < tempOperate.length; i++) {
  let copyNumArr = [...numArr];
  for (let j = 0; j < N - 1; j++) {
    copyNumArr[j + 1] = operObj[tempOperate[i][j]](
      copyNumArr[j],
      copyNumArr[j + 1]
    );
  }

  result.push(copyNumArr[copyNumArr.length - 1]);
}

console.log(`${Math.max(...result)}
${Math.min(...result)}`);

* 생각보다 힘들었다ㅠㅠ.. 다른 조건이 힘들었다기 보다는 변수가 많아지면서 머리가 어질어질했다.

변수명을 나름대로 고려해서 했는데도, 집중력이 살짝 흐려지는 순간 갑자기 머리가 백지가 됐다..

 

이렇게 정리가 잘 안되는 문제는 확실히 노트를 활용하거나 해야할 듯 싶다.

개인적으로 만만히 봤다가 머리가 지끈했던 문제이다.

 

 

 

 

도움이 되셨다면 공감 부탁드립니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.