코딩테스트 연습
프로그래머스 코딩테스트 연습 - 할인 행사 JavaScript
citron031
2022. 12. 17. 15:38
const checkValid = (wantObj, discountObj) => {
for(let key in wantObj) {
if(wantObj[key] > (discountObj[key] || 0)) {
return false;
}
}
return true;
}
function solution(want, number, discount) {
let answer = 0;
const wantObj = {};
for(let i = 0; i < want.length; i++) {
wantObj[want[i]] = number[i];
}
const discountObj = {};
for(let i = 0; i <= discount.length - 10; i++) {
if(i === 0) {
// init
for(let j = i; j < i + 10; j++) {
if(discountObj[discount[j]]) {
discountObj[discount[j]] += 1;
}else {
discountObj[discount[j]] = 1;
}
}
} else {
discountObj[discount[i - 1]] -= 1;
if(discountObj[discount[i + 9]]) {
discountObj[discount[i + 9]] += 1;
} else {
discountObj[discount[i + 9]] = 1;
}
}
if(checkValid(wantObj, discountObj)) answer++;
}
return answer;
}
문제를 해결하기 위해서 맨 처음에는 for문으로 10개씩 할인 상품의 개수를 세는 것 이었다.
하지만 곧 캐싱을 통해서 무의미한 반복을 줄일 수 있다는 것을 생각해냈다.
이를 위해서 처음에 10개의 할인 상품 객체를 만들고, 하루가 지나면 전날의 상품의 개수를 하나 줄이고 당일 상품의 개수를 늘리는 방법을 생각했다.
이렇게 만든 객체를 검증하여, 만약 원하는 상품을 모두 살 수 있다면, 그 날자를 세는 방법으로 문제를 해결하였다.