[JavaScript] 수식 최대화
2022. 8. 16. 17:39ㆍAlgorithm/프로그래머스
level : 2
문제 링크 : 수식 최대화
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
My Solution
function prior(arr){
if(arr.length===1)
return arr;
let temp = [];
arr.forEach((val,ind)=>{
const p = prior(arr.filter((v,i)=>i!==ind));
temp.push(...p.map(arr=>[val,...arr]))
})
return temp
}
function compute(v1,v2,com){
switch(com){
case '+':
return v1+v2;
case '-':
return v1-v2;
case '*':
return v1*v2;
}
}
function solution(expression) {
let answer = 0;
let numbers = expression.split(/\D/g).filter(item=>item!=='').map(Number);
let cal = expression.match(/\D/g).filter(item=>item!=='');
let formula = [numbers[0]];
cal.forEach((item,index)=>{
formula.push(item);
formula.push(numbers[index+1]);
})
const orders = prior(['*','+','-']);
orders.forEach((order)=>{
let temp = formula.slice();
order.forEach((calculater)=>{
for(let i = 0; i < temp.length; i++){
if(temp[i]===calculater){
const v1 = temp[i-1];
const v2 = temp[i+1];
const com = temp[i];
temp.splice(i-1,3,compute(v1,v2,com));
i = 0;
}
}
})
if(answer<Math.abs(temp[0]))
answer=Math.abs(temp[0]);
})
return answer;
}
풀이방법
처음 expression이라는 수식의 string형태에서 정규식을 이용하여 숫자와 연산자를 구분하였다.
그리고 숫자 사이에 연산자를 넣어주어 숫자와 연산자가 동시에 들어있는 Array를 만들었다.
prior이라는 함수를 통하여 덧셈, 뺄셈, 곱셈의 연산자의 우선순위 순으로 정렬된 모든 Array들을 원소로 가지는 2D Array를 만들었다.
각 우선순위에 따른 결과값을 계산한 후에 answer보다 절대값이 크다면 answer에 결과값의 절대값을 넣는다.
느낀점
중간에 orders를 이용하는 부분에서 아래와 같이 코드를 작성했다.
const orders = prior([...new Set(cal)]);
위와 같은 경우 수식에서 사용한 연산자만을 우선순위 정렬을 하는 방식이라 생각하였다.
하지만 연산자가 한 가지일 경우 orders는 1D Array가 되어 order가 연산자 하나인 string이기에 forEach 구문을 사용할 수 없다.
이에 에러가 발생하였다. 그리하여 아래와 같이 요구사항에서의 모든 연산자의 우선순위를 구하는 형식으로 바꾸었다.
const orders = prior(['*','+','-']);
다음에는 함수를 만들때, 어떠한 input이라도 동일한 format으로 함수가 나오게 만들어야겠다고 생각을 하였다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[JavaScript] 두 큐 합 같게 만들기 (0) | 2022.08.23 |
---|---|
[JavaScript] 올바른 괄호 (0) | 2022.08.23 |
[JavaScript] 거리두기 확인하기 (0) | 2022.08.15 |
[JavaScript] 디스크 컨트롤러 (0) | 2022.08.02 |
[JavaScript] [1차] 비밀지도 (0) | 2022.08.02 |