[프로그래머스 레벨투] 수식 최대화 👨🏻‍🏫

9rganizedChaos·2021년 10월 14일
0
post-thumbnail

🔽 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/67257

✍🏼 나의 수도 코드

  1) expression에서 기호들을 추려낸다.
  2) 해당 기호들로 permutation 배열을 만들어준다.
  3) 해당 배열들을 map을 통해 계산과정을 거쳐준다.
  4) 그 중 가장 큰 수를 리턴한다.

👨🏻‍💻 나의 문제 풀이

function calculate(originalNumSignArr, order){
    let numSignArr = originalNumSignArr.slice(0);
    for(let i = 0; i < order.length; i++){
        for(let j = 0; j < numSignArr.length; j++){
            if(numSignArr[j] === order[i]){
                if(order[i] === "+"){
                    numSignArr[j + 1] = numSignArr[j - 1] + numSignArr[j + 1];
                    numSignArr[j - 1] = "%"
                    numSignArr[j] = "%"
                } else if (order[i] === "-"){
                    numSignArr[j + 1] = numSignArr[j - 1] - numSignArr[j + 1];
                    numSignArr[j - 1] = "%"
                    numSignArr[j] = "%"
                } else if (order[i] === "*"){
                    numSignArr[j + 1] = numSignArr[j - 1] * numSignArr[j + 1];
                    numSignArr[j - 1] = "%"
                    numSignArr[j] = "%"
                }
            }
        }
        numSignArr = numSignArr.filter(numSign => numSign !== "%")
    }
    return Math.abs(numSignArr[0]);
}

function getPermutations(arr, selectNumber) {
  const results = [];
  if (selectNumber === 1) return arr.map((value) => [value]);

  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((permutation) => [fixed, ...permutation]); 
    results.push(...attached); 
  });

  return results; 
};

function solution(expression) {
    let numArr = expression.split("+").map(exp => exp.split("-")).reduce((acc, cur) => {return acc.concat(cur)}, []).map(exp => exp.split("*")).reduce((acc, cur) => {return acc.concat(cur)}, []).map(num => Number(num))
    let signArr = expression.split("").filter(str => str === "+" || str === "-" || str === "*");
    
    let originalNumSignArr = [];
    for(let i = 0; i < numArr.length; i++){
        originalNumSignArr.push(numArr[i], signArr[i])
    }
    originalNumSignArr.pop();
    
    let filteredSign = signArr.filter((sign, index) => signArr.indexOf(sign) === index);
    let orders = getPermutations(filteredSign, filteredSign.length);

    return Math.max(...orders.map(order => calculate(originalNumSignArr, order)));
}

👩🏻‍💻 다른 사람의 코드

// operator를 따로 만들어 놓고 시작
const operators = [
    ["*","+","-"],
    ["*","-","+"],
    ["+","*","-"],
    ["+","-","*"],
    ["-","+","*"],
    ["-","*","+"],
]

function solution(expression) {
    var answer = 0;
    let result = [];
  // 정규표현식으로 한 번에 깔끔하게 split!
    let operand = expression.split(/([+\-*/])/);
    operators.forEach(e => {
        let rands = [...operand];
        e.forEach(operator => {
            let newRands = [];
            for(let i=0; i<rands.length ; i++){
              // 이렇게 옮겨 담는 방식을 생각하면 포문쓰면서 인덱스 밀리는 걸 고민하지 않아도 된다.
                if(rands[i] === operator){
                    let op1 = newRands.pop();
                    let op2 = rands[i+1];
                    newRands.push(cal(op1,op2,operator));
                    i++;
                }else newRands.push(rands[i])
            }
            rands = [...newRands];
        })
        if(rands.length === 1) result.push(rands[0]);
    })
    result.sort((a,b)=> Math.abs(b)-Math.abs(a));
    return Math.abs(result[0]);
}

function cal(op1,op2,operator){
    op1 = Number(op1);
    op2 = Number(op2);
    switch(operator){
        case "*":
            return op1*op2;
        case "-":
            return op1-op2;
        case "+":
            return op1+op2;
        default:
            return -1
    }
}

🍯 알게 된 것들

  • 스택과 큐를 활용하자...!
        e.forEach(operator => {
            let newRands = [];
            for(let i=0; i<rands.length ; i++){
              // 이렇게 옮겨 담는 방식을 생각하면 포문쓰면서 인덱스 밀리는 걸 고민하지 않아도 된다.
                if(rands[i] === operator){
                    let op1 = newRands.pop();
                    let op2 = rands[i+1];
                    newRands.push(cal(op1,op2,operator));
                    i++;
                }else newRands.push(rands[i])
            }
            rands = [...newRands];
        })
  • expression.split(/([+\-*/])/); 정규표현식...!
profile
부정확한 정보나 잘못된 정보는 댓글로 알려주시면 빠르게 수정토록 하겠습니다, 감사합니다!

0개의 댓글