문제 링크
https://programmers.co.kr/learn/courses/30/lessons/67257
풀이 전략
단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다.
수식에 포함된 연산자가 2개라면 정의할 수 있는 연산자 우선순위 조합은 2! = 2가지이며, 연산자가 3개라면 3! = 6가지 조합이 가능합니다.
만약 계산된 결과가 음수라면 해당 숫자의 절댓값으로 변환하여 제출하며 제출한 숫자가 가장 큰 참가자를 우승자로 선정하며, 우승자가 제출한 숫자를 우승상금으로 지급하게 됩니다.
"-56+100"처럼 피연산자가 음수인 수식도 입력으로 주어지지 않습니다.
같은 연산자끼리는 앞에 있는 것의 우선순위가 더 높습니다.
코드
function solution(expression) {
const operPriority = [
["+", "-", "*"],
["+", "*", "-"],
["-", "+", "*"],
["-", "*", "+"],
["*", "+", "-"],
["*", "-", "+"],
];
const cal = {
"+": (a, b) => a + b,
"-": (a, b) => a - b,
"*": (a, b) => a * b,
};
let answer = 0;
const num = expression.split(/[^0-9]/).map(Number);
const operation = [];
for (const char of expression) {
if (char === "+" || char === "-" || char === "*") operation.push(char);
}
const operlen = operation.length;
for (let i = 0; i < 6; i++) {
const copyNum = num.slice();
const copyOper = operation.slice();
for (let j = 0; j < 3; j++) {
for (let k = 0; k < operlen; k++) {
if (copyOper[k] !== operPriority[i][j]) continue;
const oper = copyOper[k];
copyNum[k] = cal[oper](copyNum[k], copyNum[k + 1]);
copyNum.splice(k + 1, 1);
copyOper.splice(k, 1);
k--;
}
}
answer = Math.max(answer, Math.abs(copyNum[0]));
}
return answer;
}
회고
스킬체크로 나왔을 때는 dfs로 순열을 하나하나 확인해야 하는 줄 알았는데, 다른분들의 풀이를 보니 미리 6개의 case를 설정하여서 이를 모두 순회하는 방식으로 풀어나가셨다. 이러한 생각을 하는 것이 중요한 것 같다. 문제를 읽고 6개의 케이스로 나누어 생각하고, split,splice,slice와 같은 method들의 기능과 응용방법들을 잘알아두면 좋을 듯 하다.
참고한 블로그1
참고한 블로그2
더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)
'Algorithm > 프로그래머스[Programmers]' 카테고리의 다른 글
[JS] 2021Dev-Matching : 로또의 최고 순위와 최저 순위 프로그래머스 LEVEL1 (0) | 2022.06.24 |
---|---|
[JS] 2022카카오 : 신고 결과 받기 프로그래머스 LEVEL2 (0) | 2022.06.23 |
[JS] 2020카카오 : 괄호 변환 프로그래머스 LEVEL2 (0) | 2022.06.21 |
[JS] 2019카카오 : 오픈 채팅방 프로그래머스 LEVEL2 (0) | 2022.06.20 |
[JS] 2021카카오 : 메뉴 리뉴얼 프로그래머스 LEVEL2 (0) | 2022.06.18 |
댓글