이게 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 |
'프로그래머스' 카테고리의 다른 글
5/25[문제풀이] 프로그래머스 Lv2 피보나치 수 (0) | 2021.05.25 |
---|---|
5/24[문제풀이] 프로그래머스 Lv2 2개 이하로 다른 비트 (0) | 2021.05.24 |
5/19[문제풀이] 프로그래머스 Lv2 다음 큰 숫자 (0) | 2021.05.20 |
5/18[문제풀이] 프로그래머스 Lv2 괄호 회전하기 (0) | 2021.05.19 |
5/17[문제풀이] 프로그래머스 Lv2 영어 끝말잇기 (0) | 2021.05.17 |