[JavaScript][Programmers] 수식 최대화

조준형·2021년 8월 9일
0

Algorithm

목록 보기
59/142
post-thumbnail

🔎 수식 최대화

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/64064

📄 제출 코드

function solution(expression) {
    let signArr = [
        ['*','+','-'],
        ['*','-','+'],
        ['+','*','-'],
        ['+','-','*'],
        ['-','*','+'],
        ['-','+','*'],
    ]
    let answer = 0;
    let arr = expression.split("");
    console.log(arr);
    let numbers = [];
    let signs = [];
    let tmp = '';
    let cnt = 0;
    for (let i = 0; i < arr.length; i++) {
        let el = arr[i];
        if (el == '*' || el == '+' || el == '-') {
            numbers.push(parseInt(tmp));
            signs.push(el);
            tmp = '';
        }
        else tmp += el;
        cnt++;
        if (cnt == arr.length) numbers.push(parseInt(tmp));
    }
    

    for (let i = 0; i < 6; i++) {
        let copyNumbers = Array.from(numbers);
        let copySigns = Array.from(signs);
        
        for (let j = 0; j < 3; j++) {
            for (let k = 0; k < copySigns.length; k++) {
                if (copySigns[k] == signArr[i][j]) {
                    switch (copySigns[k]) {
                        case '*':
                            // console.log(copySigns, copyNumbers)
                            copyNumbers[k] *= copyNumbers[k + 1];
                            copyNumbers.splice(k + 1, 1);
                            copySigns.splice(k, 1);
                            // console.log(`* : ${copyNumbers}`);
                            k--;
                            break;
                        case '-':
                            // console.log(copySigns, copyNumbers)
                            copyNumbers[k] -= copyNumbers[k + 1];
                            copyNumbers.splice(k + 1, 1);
                            copySigns.splice(k, 1);
                            // console.log(`- : ${copyNumbers}`);
                            k--;
                            break;
                        case '+':
                            // console.log(copySigns, copyNumbers)
                            copyNumbers[k] += copyNumbers[k + 1];
                            copyNumbers.splice(k + 1, 1);
                            copySigns.splice(k, 1);
                            // console.log(`+ : ${copyNumbers}`);
                            k--;
                            break;
                    }
                }
            }
        }
        
        answer = Math.max(Math.abs(copyNumbers[0]), answer);
        
    }
    
    
    
    return answer;
}
let expression = "100-200*300-500+20";
console.log(solution(expression));

우선순위를 나눌 경우의 수가 6개뿐이라 6가지 경우만 약간 노가다식으로 구현하였다.
먼저 부호랑 숫자를 각각 signs와 numbers에 분리 시켰다.
그리고 우선순위 경우의 수 6가지를 돌았다.
시작할 때 먼저 원래상태의 배열들을 복사하고, 먼저 나오는 부호에 따라 먼저 계산해서 copy배열에 넣어준다.

i = 0일 때
signArr = ['*','+','-']
j = 0 일 때 '*', 복사한 sign배열을 돌면서 *를 찾으면 numbers에서 해당위치의 숫자와 그 다음 숫자를 곱한 결과를 
넣어준다. 그리고 그 다음위치 숫자는 계산했으니 splice로 삭제.
부호에서도 계산이 끝낫으니 삭제.

copyNumbers[k] *= copyNumbers[k + 1];
copyNumbers.splice(k + 1, 1);
copySigns.splice(k, 1);
부호의 길이가 하나 줄었으니 k--를 해준다.

부호 계산이 끝나고, copyNumbers에 남은 숫자와 answer를 비교하여 더 큰 수를 저장.

profile
깃허브 : github.com/JuneHyung

0개의 댓글