본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 수식 최대화

by StelthPark 2022. 3. 7.
function solution(expression) {
  const prior = [
    ["-", "*", "+"],
    ["-", "+", "*"],
    ["+", "*", "-"],
    ["+", "-", "*"],
    ["*", "+", "-"],
    ["*", "-", "+"],
  ];

  function reset(expression) {
    let newArr = [];
    let vertical = 0;
    for (let i = 0; i < expression.length; i++) {
      if (expression[i] === "-" || expression[i] === "*" || expression[i] === "+") {
        newArr.push(expression.slice(vertical, i));
        newArr.push(expression[i]);
        vertical = i + 1;
      }
      if (i === expression.length - 1) {
        newArr.push(expression.slice(vertical));
      }
    }
    return newArr;
  }
  let calc = [];
  for (let opcode of prior) {
    const temp = reset(expression);
    console.log(temp);
    for (let exp of opcode) {
      while (temp.includes(exp)) {
        const idx = temp.indexOf(exp);
        temp.splice(idx - 1, 3, eval(temp.slice(idx - 1, idx + 2).join("")));
      }
    }
    calc.push(Math.abs(temp[0]));
  }

  return Math.max(...calc);
}

처리조건

풀이

숫자는 연산자가 오로지 3개뿐이다. 그래서 연산자로 총 나올 수 있는 경우의 수는 3!으로 6개이다. 이 경우의 수를 모두 prior 배열에 담아 이중 for문으로 풀면서 문자열에 해당하는 연산자가 있는지 체크하고 있을때까지 모든 6개의 연산자 경우의 수를 도는 것이다. 그중에서 절대값처리를 하여 가장 높은 수를 리턴하면된다.

 

먼저 나는 reset이라는 함수를 짰고 함수인자로 받은 문자열을 넣으면 연산자를 제외한 앞뒤로 숫자로 묶어서 나타나게 된다. 아래 처럼 말이다. reset으로 나온 배열을 temp에 담게 된다.

6번의 경우의 수에서 사용할 똑같은 temp

이후 prior을 opcode로 나오는 첫번째 경우의 연산자안에는 또 3개의 연산자가 있을 것이다. 그 연산자를 하나씩 for문으로 풀면서 (exp) exp가 temp에 있을때 까지 while문을 돌리게 되는데 while문 내부에서 exp의 위치를 찾고 exp 기준으로 앞뒤 숫자와 exp를 제거하고 제거된 앞뒤 숫자와 exp로 계산한 숫자를 넣게된다. 주의할 점은 splice는 slice와 다르게 원본배열도 수정된다는 점을 주의해야한다. eval메소드는 인자로 1+1같은 연산자가 들어간 문자를 입력받으면 연산처리후 결과를 내어준다. 

 

while은 해당하는 exp가 temp에 있을때 까지 돌고 없을시 다음 exp롤 돌게된다. whlie이 종료되는 조건으로 해당 exp가 없을 때 까지인데 처음에 indexOf를 써서 exp가 있는지 검사했더니.. 없으면 -1을 돌려놓는다는 점에서 while이 제대로 끝나지 않았다. 그래서 includes와 같이 ture,false로 만 리턴되는 메소드를 써서 조건을 제어했다.

 

한 opcode 루틴이 다돌면 다음 opcode 루틴을 돌기전에 계산된 temp는 연산자 처리를 모두 끝내고 1자리만남게되므로 temp[0]을 calc배열에 푸시하게된다. 모든 opcode를 돌고나면 Math.max로 스프레드를 써서 calc를 넣은 뒤 최대 값을 리턴하게된다.

 

조심했던 점은 2가지인데 splice는 원본 배열도 수정된다는 점과 indexOf과 includes는 리턴으로 나오는결과에 주의해야한다는 점이다.

댓글