프로그래머스카카오 인턴 수식 최대화
문제 설명
https://programmers.co.kr/learn/courses/30/lessons/67257
답안
나의 풀이
function solution(expression) {
const priorities = [
["*", "+", "-"],
["*", "-", "+"],
["+", "*", "-"],
["+", "-", "*"],
["-", "*", "+"],
["-", "+", "*"],
];
const calc = {
"*": (num1, num2) => num1 * num2,
"+": (num1, num2) => num1 + num2,
"-": (num1, num2) => num1 - num2,
};
let nums = expression.split(/\D/).map((str) => Number(str));
let signs = expression.replace(/\d/gi, "").split("");
const answers = priorities.map((priority) => {
const nums2 = nums.slice();
const signs2 = signs.slice();
priority.forEach((sign) => {
for (let idx = 0; idx < signs2.length; idx++) {
if (sign !== signs2[idx]) continue;
const result = calc[signs2[idx]](nums2[idx], nums2[idx + 1]);
nums2.splice(idx, 2, result);
signs2.splice(idx, 1);
idx--;
}
});
return Math.abs(nums2[0]);
});
return Math.max(...answers);
}
시간복잡도: O(N3)
- 우선 순위 별로 나올 수 있는 경우 6가지를 구한다.
- 우선 순위 배열을 반복문을 돌며 해당 우선 순위로 계산할 때 나오는 값들을 각각 구한다.
- 정규식을 이용하여 숫자만 적힌 배열과 연산자만 적힌 배열을 구한다.
- 연산을 한번 할 때마다 숫자 배열과 연산자 배열에서 숫자와 연산을 splice해줘야하므로 두 배열을 slice한다.
- slice한 연산자 배열(signs2)에서 우선 순위 배열(priorty)에 연산자와 값이 같을 경우
해당 연산자 idx에 해당하는 숫자 배열(nums2)에 idx와 idx+1 두 숫자를 calc를 통해서 계산하여 result에 담는다. - nums2 배열에 splice를 통해 게산한 두 숫자를 삭제하고 result를 추가한다.
- signs2 배열에 splice를 통해 계산한 연산자를 삭제한다.
- 연산자 배열을 순회 중인데 하나를 삭제했으므로 idx–를 해준다.
- 모든 연산을 마치면 nums2는 최종 연산 결과를 담은 legnth가 1인 배열이 된다.
- 음수인 경우에는 절대값으로 계산해야하므로 Math.abs를 하여 반환해준다.
- 모든 우선 순위 경우에 해당하는 최종 연산 결과가 담은 answers 배열 중에서 Math.max를 사용하여 가장 큰 값을 반환한다.