*, -, +
인 수식이 주어진다.'100+20'
=> ['100', '+', '20']
eval
함수로 값을 계산하고, 계산된 값을 수식에 넣는다.정규식에서 [^abc]는 a나 b나 c가 아닌 값을 파싱하여 가져오도록 한다.
String.prototype.slice와 String.prototype.substring의 차이점
var text = "Mozilla";
console.log(text.substring(5, 2)); // => "zil"
console.log(text.slice(5, 2)); // => ""
var text = "Mozilla";
console.log(text.substring(-5, -2)); // => ""
console.log(text.slice(-5, -2)); // => "zil"
for ... of
반복 가능한 객체
(iterable object)에 대해서 반복한다.Symbol.iterator
key의 속성을 가져야 한다는 것이다.for (const element of "abc") {
console.log(element);
}
// expected output: "a"
// expected output: "b"
// expected output: "c"
const makePriority = (candidate, priority, list) => {
if (candidate.length === 0) {
list.push(priority);
return;
}
for (let i = 0; i < candidate.length; i++) {
const newCandidate = candidate.slice(0, i) + candidate.slice(i + 1);
const newPriority = priority + candidate[i];
makePriority(newCandidate, newPriority, list);
}
};
const getPriorityList = (expression) => {
const priorityList = [];
const candidate = [...new Set(expression.match(/[^\d]/g))];
makePriority(candidate, "", priorityList);
return priorityList;
};
const evalExpression = (priority, exp) => {
let expression = [...exp];
for (const op of priority) {
while (expression.indexOf(op) !== -1) {
const opIdx = expression.indexOf(op);
const evaluatedExp = `${eval(
expression.slice(opIdx - 1, opIdx + 2).join("")
)}`;
expression = [
...expression.slice(0, opIdx - 1),
evaluatedExp,
...expression.slice(opIdx + 2),
];
}
}
return Math.abs(+expression[0]);
};
function solution(expression) {
const expList = expression.match(/\d+|[+\-*]/g);
const priorityList = getPriorityList(expression);
const answer = priorityList.reduce((maxResult, priority) => {
const result = evalExpression(priority, expList);
return Math.max(maxResult, result);
}, 0);
return answer;
}
expression = [ // 새로운 배열을 가리키도록 함.
...expression.slice(0, opIdx - 1),
evaluatedExp,
...expression.slice(opIdx + 2),
];