[プログラマ]式の最大化-JavaScript


プログラマレベル2-式の最大化

  • 題分類:2020 KACA実習生
  • 題出所:プログラマレベル2-式の最大化2
  • 📌 問題の説明





    📌 思考の解き方(初めての試み->失敗)

  • の数値と式を別々にして、数値と式に格納します.
  • の電流値が0の場合、+、1は−、2は*で計算される.
  • 文を
  • の式の個数で繰り返し、絶対値が最大値の値を返します.
  • 📌 に答える

    function solution(expression) {
      let answer = 0;
      let expressions = [];
      let numbers = [];
    
      let expressionLoc = 0;
    
      // 숫자와 수식을 분리하여 numbers와 expressions에 각각 저장한다.
      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;
          }
          // current값이 0이면 +, 1이면 -, 2이면 *로 계산을 진행한다.
          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つのケースの数.
  • の数値と式を別々にして、数値と式に格納します.
  • 優先度で6種類の演算を行います.
  • は、
  • の絶対値が最大値である値を返します.
  • 📌 に答える

    function solution(expression) {
      let answer = 0;
      let numbers = [];
      let expressions = [];
      let expressionLoc = 0;
    
      // 나올수 있는 6가지 경우의 수를 선언한다.
      const equations = [
        ["+", "-", "*"],
        ["+", "*", "-"],
        ["-", "+", "*"],
        ["-", "*", "+"],
        ["*", "+", "-"],
        ["*", "-", "+"],
      ];
    
      // 숫자와 수식을 분리하여 numbers와 expressions에 각각 저장한다.
      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;
    
      // 우선순위에 맞게 6가지의 연산을 한다.
      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;
    }