본문 바로가기

프로그래머스

5/20[문제풀이] 프로그래머스 Lv2 수식 최대화

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

 

이게 Lv2 라는 것이 믿기지 않았다. 푸는데 생각보다 오래 걸렸고 구글링을 통해 도움을 받았다.

 

문제풀이

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
function solution(expression) {
  let answer = 0;
  let operator = expression.replace(/[0-9]/g,""); // 연산자 추출
 
  let uniqueOperator = Array.from(new Set(operator)); // 연산자 중복 제거 및 배열에 담기
 
  let checkList = check(uniqueOperator); // 실제 사용한 연산자를 통해 나올 수 있는 모든 경우의 수 나열
    // 재귀 함수 사용
  let numberList = expression.split(/[\+\-\*\/]/); // 주어진 숫자 배열에 '' 구분으로 담기
  
  checkList.forEach((item)=> { 
    let tempOperator = operator; // 연산자 사용하기 위해 불러옴
   
    let tempNumberList = [...numberList]; // 숫자 사용하기 위해 불러옴
      
      for(let i =0; i< item.length ; i++){ 
        while(tempOperator.includes(item[i])){ // 우선순위가 앞에 있는 연산자가 더 있나 확인하고 없으면 해당 연산자 끝
          let currentCalIndex = tempOperator.indexOf(item[i]); // 계산해야 할 연산자 idx 위치
            
          let test = tempNumberList[currentCalIndex] + item[i] + tempNumberList[currentCalIndex+1]; 
            // 연산자 앞 뒤로 숫자 계산하기
            
          tempNumberList.splice(currentCalIndex,2,eval(test.toString()));
          // 계산된 숫자는 없애고 계산된 값 넣기
          tempOperator =tempOperator.replace(item[i],"")
          // 계산 완료된 연산자 1개는 없앰
        }
      }
      if(answer < Math.abs(tempNumberList[0])) answer = Math.abs(tempNumberList[0]);
      // 절대 값 비교해서 제일 큰 수 처리!
  })
  return answer;
}
 
function check(inputArr) {
  var results = [];
  function permute(arr, memo) {
    var cur, memo = memo || [];
    for (var i = 0; i < arr.length; i++) {
      cur = arr.splice(i, 1);
      if (arr.length === 0) {
        results.push(memo.concat(cur));
      }
      permute(arr.slice(), memo.concat(cur));
      arr.splice(i, 0, cur[0]);
     
    }
    return results;
  }
 
  return permute(inputArr);
}
cs