https://school.programmers.co.kr/learn/courses/30/lessons/67257
// 탐색을 통해 ["+", "-", "*"] 경우의 수 추출
const permutation = (operation, visited, priority, max, expression) => {
if (operation.length === visited.filter((o) => o).length) { // 총 방문이 연산자 수 만큼 될 경우,
const [tempExp, tempPrior] = [[...expression], [...priority]];
// 우선순위에 따라 값을 구함.
while (tempPrior.length) {
const op = tempPrior.shift(); // 우선순위 데이터를 하나씩 제거하면서 도출
let idx = tempExp.indexOf(op);
while (idx !== -1) { // 해당 연산자가 있을 경우, 반복
const sum = eval(tempExp[idx - 1] + op + tempExp[idx + 1]);
// idx가 연산자 인덱스이므로 계산해야할 두 값은 idx-1, idx+1
tempExp.splice(idx - 1, 3, sum);
// splice를 통해 idx - 1부터 3개를 삭제하고 구한 값을 그 자리에 넣음.
// ex) ['1','+','2','*','3']에서 연산자가 '+'라면 splice후에 값은 [3,'*','3']으로 변환.
idx = tempExp.indexOf(op);
}
}
return Math.max(max, Math.abs(parseInt(tempExp))); // tempExp에는 최종적으로 계산된 값 하나만 남게 되며, max값과 비교.
}
for (let i = 0; i < operation.length; ++i) {
if (visited[i]) continue;
(visited[i] = true), priority.push(operation[i]);
max = permutation(operation, visited, priority, max, expression);
(visited[i] = false), priority.pop();
}
return max;
};
const solution = (expression) => permutation(["+", "-", "*"], new Array(3).fill(false), [], 0, expression.match(/\d+|[\-\+\*]/g));
// 마지막 매개변수 - 숫자와 연산자를 나누는 정규표현식
// ex) '50*6-3*2' => ['50','*','6','-','3','*','2']
'Coding Test > Programmers' 카테고리의 다른 글
[Programmers] (Summer/Winter Coding(~2018)) Lv 2. 배달 (0) | 2023.03.16 |
---|---|
[Programmers] (2021 Dev-Matching: 웹 백엔드 개발자(상반기)) Lv 2. 행렬 테두리 회전하기 (0) | 2023.03.15 |
[Programmers] Lv 2. 택배상자 (0) | 2023.03.13 |
[Programmers] Lv 2. 줄 서는 방법 (0) | 2023.03.12 |
[Programmers] (2018 KAKAO BLIND RECRUITMENT) Lv 2. [3차] 방금그곡 (0) | 2023.03.09 |
댓글