주어진 N을 최대한 적게 사용하여 사칙연산(+, -, *, /)으로 목표하는 number를 만들고, 최소 몇개가 필요한지 구하는 문제이다.
유의할 점은 N=5인 경우 두 개를 사용하면 55로도 만들 수 있지만,
그렇다고 N=5 number=105일때
(5 + 5) = 10
10 + "5" = 105
이렇게는 할 수 없다는 점이다.
이미 사칙연산된 숫자에는 N을 붙일 수 없고, 사칙연산할 원소로만 사용해야 한다.
function solution(N, number) {
var answer = 0;
if(N == number) return 1;
// 5
// 55 5+5 5-5 5/5 5*5 // [55 0 10 1 25] // 55 + 사칙연산
// 555, [55 0 10 1 25]* 사칙연산
// 주어진 배열을 N으로 사칙연산하여 리턴하는 함수
const four = (n, arr) => {
const result = [];
for(let i of arr) {
result.push(i+n, i-n, Math.ceil(i/n), i*n);
}
return result;
}
// 주어진 배열들로 조합을 만들어내는 함수
const comb = (arr1, arr2) => {
const result = [];
for(let i of arr1) {
result.push(...four(i, arr2));
}
return [...new Set(result)];
}
let repeatNum = N; // 5 55 555
let temp = [[N]]; // 1개만 사용하는 경우는 미리 추가
// 9회차 까지만 반복한다.
for(let i = 2; i<9;i++) {
const arr = [];
repeatNum = parseInt(repeatNum + N.toString());
// 조합할 배열에 반복숫자를 추가해준다(55)
arr.push(repeatNum);
// 추가된 배열로 조합을 구한다.
for(let j = 0; j<temp.length; j++) {
arr.push(...comb(temp[j], temp[temp.length-j-1]));
}
temp.push(arr.filter((a, i) => a > 0 && arr.indexOf(a) === i));
if(arr.includes(number)) return i;
}
// 찾지 못한 경우 -1을 리턴한다.
return -1;
}
'Web development > Algorithm' 카테고리의 다른 글
[프로그래머스] 부족한 금액 계산하기 (javascript) (0) | 2021.08.20 |
---|---|
[LeetCode] 55. Jump Game (javascript) (0) | 2021.08.20 |
[프로그래머스] 해시/위장 (0) | 2021.08.12 |
[LeetCode] 198. House Robber (javascript) (0) | 2021.08.12 |
[LeetCode] 118. Pascal's Triangle (javascript) (0) | 2021.08.12 |
댓글