[lv2] 할인 행사

걸음걸음·2023년 3월 22일
0

Test

목록 보기
22/29

문제 링크

  • 금액 지불하면 10일 동안 회원 자격
  • 회원에게 매일 한 가지 제품 할인 행사, 하루에 하나씩만 구매 가능
  • 원하는 제품과 수량이, 할인하는 날짜와 10일 연속으로 일치할 경우 회원가입
    (10일 안에 원하는 제품을 모두 구매할 수 있는 경우 회원가입)
  • 원하는 제품 배열 want
  • 원하는 제품의 수량 배열 number
  • 할인하는 제품을 나타내는 문자열 배열 discount
  • 회원가입이 가능한 날짜의 총 일 수 return
    (가능한 날이 없으면 0 return)
function solution(want, number, discount) {
    // discount에서 want에 있는 목록이 number만큼 10 연속으로 있는지 확인 필요
  	// discount를 10개씩 슬라이스
    // 슬라이스 한 배열의 요소를 shift해서 want에 있으면, 해당 요소의 인덱스를 number에서 찾아 -1
    // number이 모두 0이 되면 count+1 < number의 요소에 0 아닌 값이 있으면 X
  	
  	// return 할 일 수
    let count = 0;
  	
  	// discount를 10개씩 자르기 위한 반복문
    for(let i = 0; i<discount.length; i++){
	    // 잘랐을 때 10개 이하가 되는 경우 반복문 탈출
        if(i+10 > discount.length) break;
      	// 10개씩 자르기
        let turm = discount.slice(i, i+10);
      	// 자른 배열과 비교할 number 배열 복사
        let newNum = number.slice();
        for(let j=0; j<=10; j++){
            const item = turm.shift()
            let idx = want.indexOf(item)
            // 꺼낸 turm의 요소가 want에 있는 품목일 경우
            if(idx !== -1){
                newNum[idx] = newNum[idx]-1;
            }
        }
      	// newNum에 0이 아닌 요소가 없는 경우
      	// (0이 아닌 요소만 꺼낸 배열의 길이가 0인 경우)
        if(!newNum.filter((ele)=> ele !== 0).length){
            count++;
        }
    }
    return count;
}

다른 사람의 풀이

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;
}

하나하나 비교하는 것이 아니라 10개씩 자른 배열에 filter를 해서 나온 아이템의 수와 number에서 요구하는 수가 같을 경우 count를 올리는 식을 사용하셨다

profile
꾸준히 나아가는 개발자입니다.

0개의 댓글