문제 번호 : 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)}`);
* 생각보다 힘들었다ㅠㅠ.. 다른 조건이 힘들었다기 보다는 변수가 많아지면서 머리가 어질어질했다.
변수명을 나름대로 고려해서 했는데도, 집중력이 살짝 흐려지는 순간 갑자기 머리가 백지가 됐다..
이렇게 정리가 잘 안되는 문제는 확실히 노트를 활용하거나 해야할 듯 싶다.
개인적으로 만만히 봤다가 머리가 지끈했던 문제이다.
도움이 되셨다면 공감 부탁드립니다.