프로그래머스 Level 2 - 수식 최대화
📌 문제 설명
📌 생각한 풀이 방법 (1차 시도 -> 실패)
- 숫자와 수식을 분리하여 numbers와 expressions에 각각 저장한다.
- current값이 0이면 +, 1이면 -, 2이면 *로 계산을 진행한다.
- 나온 수식의 갯수만큼 반복문을 반복하고, 절대값이 최대인 값을 반환한다.
📌 풀이
function solution(expression) {
let answer = 0;
let expressions = [];
let numbers = [];
let expressionLoc = 0;
for (let i = 0; i < expression.length; i++) {
if (
expression[i] === "+" ||
expression[i] === "-" ||
expression[i] === "*"
) {
expressions.push(expression[i]);
numbers.push(expression.slice(expressionLoc, i));
expressionLoc = i + 1;
}
}
numbers.push(expression.slice(expressionLoc, expression.length));
numbers = numbers.map((number) => +number);
let expressionCount = new Set([...expressions]).size;
for (let i = 0; i < expressionCount; i++) {
let array = [...numbers];
let expressionArr = [...expressions];
for (let j = 0; j < 3; j++) {
let current = j + i;
if (current > 2) {
current -= 3;
}
switch (current) {
case 0:
for (let k = 0; k < expressionArr.length; k++) {
if (expressionArr[k] === "+") {
let sum = array[k] + array[k + 1];
array.splice(k, 2, sum);
expressionArr.splice(k, 1);
k--;
}
}
break;
case 1:
for (let k = 0; k < expressionArr.length; k++) {
if (expressionArr[k] === "-") {
let sum = array[k] - array[k + 1];
array.splice(k, 2, sum);
expressionArr.splice(k, 1);
k--;
}
}
break;
case 2:
for (let k = 0; k < expressionArr.length; k++) {
if (expressionArr[k] === "*") {
let sum = array[k] * array[k + 1];
array.splice(k, 2, sum);
expressionArr.splice(k, 1);
k--;
}
}
break;
}
}
answer = Math.max(answer, Math.abs(...array));
}
return answer;
}
📌 생각한 풀이 방법 (2차 시도 -> 성공)
- 나올수 있는 6가지 경우의 수를 선언한다.
- 숫자와 수식을 분리하여 numbers와 expressions에 각각 저장한다.
- 우선순위에 맞게 6가지의 연산을 한다.
- 절대값이 최대인 값을 반환한다.
📌 풀이
function solution(expression) {
let answer = 0;
let numbers = [];
let expressions = [];
let expressionLoc = 0;
const equations = [
["+", "-", "*"],
["+", "*", "-"],
["-", "+", "*"],
["-", "*", "+"],
["*", "+", "-"],
["*", "-", "+"],
];
for (let i = 0; i < expression.length; i++) {
if (
expression[i] === "+" ||
expression[i] === "-" ||
expression[i] === "*"
) {
expressions.push(expression[i]);
numbers.push(expression.slice(expressionLoc, i));
expressionLoc = i + 1;
}
}
numbers.push(expression.slice(expressionLoc, expression.length));
numbers = numbers.map((number) => +number);
let expressionCount = new Set([...expressions]).size;
for (let i = 0; i < equations.length; i++) {
let array = [...numbers];
let expressionArr = [...expressions];
let current = equations[i];
for (let j = 0; j < expressionCount; j++) {
let currentEquation = current[j];
switch (currentEquation) {
case "+":
for (let k = 0; k < expressionArr.length; k++) {
if (expressionArr[k] === "+") {
let sum = array[k] + array[k + 1];
array.splice(k, 2, sum);
expressionArr.splice(k, 1);
k--;
}
}
break;
case "-":
for (let k = 0; k < expressionArr.length; k++) {
if (expressionArr[k] === "-") {
let sum = array[k] - array[k + 1];
array.splice(k, 2, sum);
expressionArr.splice(k, 1);
k--;
}
}
break;
case "*":
for (let k = 0; k < expressionArr.length; k++) {
if (expressionArr[k] === "*") {
let sum = array[k] * array[k + 1];
array.splice(k, 2, sum);
expressionArr.splice(k, 1);
k--;
}
}
break;
}
}
answer = Math.max(answer, Math.abs(...array));
}
return answer;
}