프로그래밍/알고리즘 풀이
[node.js] 수식 최대화 ( 프로그래머스 레벨2 )
카카수(kakasoo)
2021. 6. 30. 09:16
반응형
// 프로그래머스 레벨 2 [카카오 인턴] 수식 최대화
const getPriority = () => {
const operator = ["+", "-", "*"];
const priority = [];
let visited;
let answer;
const dfs = (start) => {
visited[start] = true;
answer.push(operator[start]);
if (answer.length === 3) {
priority.push([...answer]);
}
for (let i = 0; i < operator.length; i++) {
if (!visited[i]) {
visited[i] = true;
dfs(i);
visited[i] = false;
answer.pop();
}
}
};
for (let i = 0; i < operator.length; i++) {
visited = new Array(3).fill(false);
answer = [];
dfs(i);
}
return priority;
};
const splitExpression = (expression) => {
let answer = [expression];
["+", "-", "*"].forEach((operator) => {
for (let i = 0; i < answer.length; i++) {
const diviedExpresses = answer[i].split(operator);
const temp = [];
for (let i = 0; i < diviedExpresses.length; i++) {
temp.push(diviedExpresses[i]);
temp.push(operator);
}
temp.pop();
answer[i] = temp;
}
answer = answer.flat();
});
return answer;
};
const evalueateExpress = (express, priority) => {
priority.forEach((operator) => {
while (express.includes(operator)) {
const operatorIdx = express.indexOf(operator);
const firstOperand = operatorIdx - 1;
const secondOperand = operatorIdx + 1;
express.splice(
firstOperand,
3,
eval(express[firstOperand] + operator + express[secondOperand])
);
}
});
return express;
};
const solution = (expression) => {
const priority = getPriority();
const answer = [];
priority.forEach((el) => {
const diviedExpresses = splitExpression(expression);
const curValue = evalueateExpress(diviedExpresses, el);
answer.push(curValue);
});
return Math.max(
...answer.flat(Infinity).map((el) => (el >= 0 ? el : el * -1))
);
};
가능한 경우의 수를 뽑아서 모두 돌려보는 수 밖에 없다.
반응형