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

알고리즘

Posted by Kyun2da on July 12, 2020

1️⃣서론

프로그래머스 level2 문제 수식 최대화입니다. Javascript를 이용하여 해결하였습니다.

2️⃣문제 설명

수식 최대화1 수식 최대화2 수식 최대화3

3️⃣풀이

이 문제는 카카오 인턴십 2020문제입니다. +, -, *로 나타낼 수 있는 수식의 가짓수는 6가지이므로 완전탐색을 통하여 모든 경우의 수를 구해 절댓값이 가장 큰 값을 리턴하면 되는 문제였습니다. 이 문제의 key Point는 어떻게 기호의 우선순위대로 계산을 해서 답을 도출하느냐가 가장중요한 부분이 아니었나 싶습니다. 제가 푼 풀이 방법은 다음과 같습니다.

  1. 먼저 수식을 기호와 숫자로 나눈다.
  2. 배열과 수식을 복사하여 각 수식 우선순위마다 계산을 도출한다.
  3. 계산 후에 최댓값과 계속 비교하여 최댓값을 찾는다.

4️⃣ 내가 푼 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
const solution = (expression) => {
  const arr = [
    ["+", "-", "*"],
    ["+", "*", "-"],
    ["-", "+", "*"],
    ["-", "*", "+"],
    ["*", "+", "-"],
    ["*", "-", "+"],
  ];

  //1. 수식을 숫자(num)과 기호(sign)으로 나눈다.
  let num = expression.split(/[^0-9]/);
  num = num.map((it) => {
    return parseInt(it);
  });
  const sign = [];
  for (let i = 0; i < expression.length; i++) {
    if (
      expression[i] === "*" ||
      expression[i] === "+" ||
      expression[i] === "-"
    ) {
      sign.push(expression[i]);
    }
  }

  let maxNum = 0;
  for (let i = 0; i < arr.length; i++) {
    //2. 배열과 수식을 복사한다.
    const copyNum = num.slice();
    const copySign = sign.slice();
    for (let j = 0; j < arr[i].length; j++) {
      for (let k = 0; k < copySign.length; k++) {
        if (copySign[k] === arr[i][j]) {
          if (copySign[k] === "*") {
            copyNum[k] *= copyNum[k + 1];
            copyNum.splice(k + 1, 1);
            copySign.splice(k, 1);
            k--;
          } else if (copySign[k] === "+") {
            copyNum[k] += copyNum[k + 1];
            copyNum.splice(k + 1, 1);
            copySign.splice(k, 1);
            k--;
          } else {
            copyNum[k] -= copyNum[k + 1];
            copyNum.splice(k + 1, 1);
            copySign.splice(k, 1);
            k--;
          }
        }
      }
    }
    //3. 계산후에 최댓값과 비교하여 최댓값을 찾는다.
    if (Math.abs(copyNum[0]) >= maxNum) {
      maxNum = Math.abs(copyNum[0]);
    }
  }
  return maxNum;
};

5️⃣ 결론

level2 지만 구현력을 상당히 요구하는 문제였습니다. 2020 인턴십 시험을 볼때는 테스트 케이스 몇개를 통과하지 못했었는데 다시 문제가 등록되고 나서 풀어보니 무사히 테스트케이스를 전부 통과할 수 있었습니다. 숫자와 수식을 분리하자는 아이디어만 쉽게 떠올릴 수 있다면 그렇게 헤맬필요가 없었는데 인턴십때는 완벽하게 통과하지 못했던 것이 아쉽습니다. 좀더 노력해야할 것 같습니다.

6️⃣ 마치며..

질문과 지적은 환영합니다. 이 문제는 최적의 정답일 수도 아닐수도 있습니다.
궁금한게 있으시면 아래 댓글 남겨주세요.🙏
댓글은 저에게 큰 힘이 됩니다!
감사합니다. ❤️