본문 바로가기
기초다지기/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;
}