말랑한 하루
[Programmers] 수식 최대화 (Lv 2, JavaScript) 본문
반응형
[ 개요 ]
풀이시간 : 70분
[ 학습 내용 ]
JS에서 조합, 순열 구현을 기반으로 풀이를 진행
[ 소스 코드 ]
function splitExpression(ex) {
var exs = [];
var oper = new Set();
var idx = 0;
for(var i=0; i<ex.length; i++) {
if ("0".charCodeAt(0) > ex.charCodeAt(i)
|| ex.charCodeAt(i) > "9".charCodeAt(0)) {
exs.push(parseInt(ex.slice(idx, i)));
exs.push(ex[i]);
oper.add(ex[i]);
idx = i + 1;
}
}
exs.push(parseInt(ex.slice(idx)));
return [exs, Array.from(oper)];
}
function getPermutations(arr, selectNumber) {
const results = [];
if (selectNumber === 1) return arr.map((el) => [el]);
arr.forEach((fixed, index, origin) => {
const rest = [...origin.slice(0, index), ...origin.slice(index+1)];
const permutations = getPermutations(rest, selectNumber - 1);
const attached = permutations.map((el) => [fixed, ...el]);
results.push(...attached);
});
return results;
}
function calc(oper, fs, se) {
switch(oper) {
case "+":
return fs + se;
case "-":
return fs - se;
case "*":
return fs * se;
}
}
function solution(expression) {
var answer = 0;
var [expressions, operators] = splitExpression(expression);
var operator_permutations = getPermutations(operators, operators.length);
operator_permutations.forEach((opers, index) => {
let express = expressions;
opers.forEach((oper) => {
let index = 1;
for(var i=1; i<express.length;) {
if (oper === express[i]) {
let result = calc(express[i], express[i-1], express[i+1]);
express = [...express.slice(0, i-1), result, ...express.slice(i + 2)];
} else {
i+= 2;
}
}
});
answer = Math.max(answer, Math.abs(express[0]));
})
return answer;
}
[ 코드 분석 ]
문자열 수식을 숫자+연산자로 구분하여 배열에 심은 뒤,
연산자를 기준으로 우선순위에 따라 계산할지, 넘길지 판단하여 모든 연산자를 계산한다.
1) splitExpression : 문자열 수식을 숫자+연산자로 분리
2) getPermutations : 연산자의 우선순위 부여 순열
3) calc : 연산자 계산
반응형
'문제풀이 > Programmers' 카테고리의 다른 글
[Programmers] 불량 사용자 (Lv 3, JavaScript) (0) | 2022.07.20 |
---|---|
[Programmers] 보석 쇼핑 (Lv 3, JavaScript) (0) | 2022.07.20 |
[Programmers] 거리두기 확인하기 (Lv 2, JavaScript) (0) | 2022.07.13 |
[Programmers] 괄호 변환 (Lv 2, JavaScript) (0) | 2022.07.13 |
[Programmers] 메뉴 리뉴얼 (Lv 2, JavaScript) (0) | 2022.07.11 |
Comments