기초다지기/JS 코딩테스트
javaScript 주어진 조건에 따라 매칭되는 경우의 수
by 김빵그
2024. 1. 2.
문제
원하는 제품과 수량이 할인되는 날짜에 맞게 순서대로 나열된 할인 제품이 주어졌을 때, 해당 제품과 수량으로 10일 동안 매일 할인 받아 회원 가입이 가능한 날짜의 총 일수를 반환
풀이
function solution(want, number, discount) {
const MAX_SLICE_LENGTH = 10;
const isMatch = (discount) => {
const wantMap = discount.reduce((acc, d) => {
acc[d] = (acc[d] || 0) + 1;
return acc;
}, {});
return want.every((w, i) => wantMap[w] === number[i]);
};
let answer = 0;
for (let i = 0; i <= discount.length - MAX_SLICE_LENGTH; i++) {
const list = discount.slice(i, i + MAX_SLICE_LENGTH);
if (isMatch(list)) answer++;
}
return answer;
}
- MAX_SLICE_LENGTH : 하루에 할인되는 제품의 최대 수량
- isMatch
- 빈 객체를 초기화하여 제품별 수량을 저장할 맵을 만듦
- 현재 제품d가 이미 맵에 존재한다면 수량 증가시키고, 존재하지 않으면 1로 초기화
- want 배열과 number 배열을 순회하면서 각 제품이 원하는 수량과 일치하는지 확인
- for
- discount 배열을 Max_slice_length 만큼씩 슬라이스
- 현재 슬라이스가 원하는 조건과 일치하면 answer 증가
다른 풀이
function solution(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 solution(want, number, discount) {
let answer = 0;
for(let i = 0; i <= discount.length-10; ++i){
let target = [...number]
for(let d = 0; d < 10; ++d){
let t = want.indexOf(discount[i+d])
if(t >= 0){
target[t] -= 1
}
}
if(target.every(v=>v<=0)){
answer+=1
}
}
return answer;
}