반응형
▷ 문제 : 2020 카카오 인턴십 - 수식 최대화 LV.2
▷ 해결 날짜 : 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;
}
▷ 복기 :
다 풀어보니 생각보다 그렇게 어려운 문제는 아니였는데, 막상 처음 접해보면 문제만 보고 기가 죽어 풀기 싫어진다...
카카오는 인턴십도 어렵네;
반응형
댓글