

function sol01(want, number, discount) {
let answer = 0;
let count = 0;
let countObj = {};
var discountList = new Set(discount);
discountList = [...discountList];
const isDiscount = want.every((item) => discountList.includes(item));
if (!isDiscount) {
return 0;
}
for (let i = 0; i < discount.length; i++) {
count = 0;
want.forEach((item, index) => {
countObj[item] = number[index];
});
for (let j = 0; j < 10; j++) {
const item = discount[i + j];
if (countObj[item] > 0) {
countObj[item]--;
count++;
if (count === 10) {
answer++;
break;
}
}
}
}
return answer;
}
어떤거는 키와 밸류가 분리된 배열이고 어떤거는 캐 밸류가 담긴 배열이고 아주 머리가 아팠다.
아래는 countObj를 그때그때 만드는 것이 아니라 깊은복사로 구현한 것이다.
function sol02(want, number, discount) {
let answer = 0;
let count = 0;
let countObjOrigin = {};
var discountList = new Set(discount);
discountList = [...discountList];
const isDiscount = want.every((item) => discountList.includes(item));
if (!isDiscount) {
return 0;
}
want.forEach((item, index) => {
countObjOrigin[item] = number[index];
});
for (let i = 0; i < discount.length; i++) {
count = 0;
const countObj = { ...countObjOrigin };
for (let j = 0; j < 10; j++) {
const item = discount[i + j];
if (countObj[item] > 0) {
countObj[item]--;
count++;
if (count === 10) {
answer++;
break;
}
}
}
}
return answer;
}
function sol1(want, number, discount) {
let count = 0;
for (let i = 0; i < discount.length - 9; i++) {
const slice = discount.slice(i, i+10);
let flag = true;
for (let j = 0; j < want.length; j++) {
if (slice.filter(item => item === want[j]).length !== number[j]) {
flag = false;
break;
}
}
if (flag) count += 1;
}
return count;
}
내 방법과 비슷하지만 문자열을 잘라서 간다는 차이점이 있다.
셋다 이다.

function random(max, q) {
let arry = [];
const multipliedE = [...q];
for (let i = 1; i < max + 1; i++) {
arry = [...arry, ...multipliedE];
}
return arry;
}
const q = ["banana", "apple", "rice", "pork", "pot"];
const w = [2, 2, 2, 2, 2];
const e = random(20, q);
const r = random(100, e);
최악의 경우가 나오도록 세팅하였다.

너무나도 당연하게
필요한 만큼만 자르기 > 깊은 복사 > 그때그때 새로 만들기 순으로 빨랐다.

모든 구간에 대해 탐색할 수 밖에 없으므로 정직하게 증가한다.