본문 바로가기
Algorithm/문제풀이

[프로그래머스] 수식 최대화(LV.2) by javascript - 2020 카카오 인턴십

by 썸머워즈 2022. 3. 16.
반응형

▷ 문제 : 2020 카카오 인턴십 - 수식 최대화 LV.2

 

코딩테스트 연습 - 수식 최대화

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

programmers.co.kr

▷ 해결 날짜 : 2022.03.15
▷ 소요 시간 : 1시간 20분
▷ 풀이 과정 :
문제를 읽어보면 이 문제는 순열 문제라는것을 금방 파악할 수 있다.

문제는 수식을 전달 받았을 때 연산자 우선순위에 따라 가장 큰 값이 나오는 경우를 구하면 되는 문제이다.

 

다행히 수식과 연산자의 위치는 변하지 않고 우선순위만 바뀌는것이기 때문에,

우선순위에 대한 순열을 전부 구하고 계산을 진행해주는 식으로 접근하면 좋다.

 

1. 문제에서 ['+', '-', '*'] 연산자만 사용한다 하여 이 세가지에 대한 순열을 구한다.

2. 순열의 길이만큼 반복을 실행하며 매개변수로 전달받은 수식을 제어하기 쉽게 잘게 쪼개 배열로 만든다.

3. 연산자의 우선순위에 따라 2번에서 잘게 쪼갠 배열에서 해당 연산자를 찾아 앞 뒤 숫자와 함께 계산 후 변경해준다.

4. 이 과정을 순열의 길이만큼 계속해서 실행한다.


▷ 구현

function solution(expression) {
    let answer = [];
    const permutations = getPermutations(['+', '-', '*'], 3);
    permutations.forEach(permutation => {
        const nums = expression.split(/(\D)/);
            permutation.forEach(exp => {
                while(nums.includes(exp)){
                    const idx = nums.indexOf(exp);
                    nums.splice(idx - 1, 3, caclulate(nums[idx-1], nums[idx+1], exp));
                }
        });
        answer.push(Math.abs(nums[0]));
    });
    
    return Math.max(...answer);
}

function caclulate(a, b, exp){
    let numA = Number(a);
    let numB = Number(b);
    return (exp === '*') ? numA * numB 
         : (exp === '+') ? numA + numB : numA - numB;
}

function getPermutations(arr, num){
    const results = [];
    if(num === 1) return arr.map(v => [v]);

    arr.forEach((fixed, index, origin) => {
        const rest = [...origin.slice(0, index), ...origin.slice(index + 1)];
        const permutations = getPermutations(rest, num - 1);
        const attached = permutations.map(v => [fixed, ...v]);
        results.push(...attached);
    });

    return results;
}

 

▷ 복기 :
다 풀어보니 생각보다 그렇게 어려운 문제는 아니였는데, 막상 처음 접해보면 문제만 보고 기가 죽어 풀기 싫어진다...

카카오는 인턴십도 어렵네;

반응형


댓글

TOP