본문 바로가기
자료구조 & 알고리즘

프로그래머스 - 할인 행사 ( 자바스크립트 풀이 )

by PARADISE247 2025. 1. 11.
반응형
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

나의 코드

작성한 코드는 우선 이와 같다. 이제 풀이를 살펴보자.

function solution(want, number, discount) {
    let day = 0, answer = 0;
    while(day < discount.length){
        let list = shoppingList = want.reduce((a,c,i) => {
            a[c] = number[i];
            return a;
        },{});
        let sliced = discount.slice(day, day + 10);
        for(let x of sliced){
            if(list[x]) list[x] -= 1;
            else list[x] = 1;
        }
        if(Object.values(list).filter(x => x > 0).length === 0) answer++;
        day++;
    }
    return answer;
}

 

풀이

우선 문제 풀이를 위해 예제를 두자.

want number discount
["banana", "apple", "rice", "pork", "pot"] [3, 2, 2, 2, 1] ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"]

 

몇번째 날에 가입을 할 지에 대한 변수 day, 회원가입 가능한 날을 기록하기 위한 answer 변수를 선언한다.

let day = 0, answer = 0;

이제 discount를 돌면서 차례대로 10일 안에 원하는 물품을 개수에 맞게 구매할 수 있는지 확인해보자.

while(day < discount.length)

우선 쇼핑 리스트를 Object로 표현해보자.

let list = want.reduce((a,c,i) => {
	a[c] = number[i];
	return a;
},{});

 

 

그럼 list 값은 예제에 의하면 다음과 같다.

{ banana: 3, apple: 2, rice: 2, pork: 2, pot: 1 }

이제 회원가입 날을 기준으로 10일 동안 판매하는 품목을 살펴보자.

let sliced = discount.slice(day, day + 10);

day = 0인 경우, sliced의 값은 다음과 같다.

["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice"]

 

 

회원가입 가능한 날이 되는 조건은 우선 쇼핑 리스트 list의 품목들의 value가 모두 0이 되어야 한다. 쇼핑 리스트에 있는 모든 품목이 충분히 10일 내 할인 품목 리스트에 있는 경우에만 value가 0이 될 것이다.

for(let x of sliced){
	if(list[x]) list[x] -= 1;
    else list[x] = 1;
}

이 조건에 맞는 회원가입 날을 판별하기 위해 sliced의 품목을 차례대로 for문으로 돌면서 list에 해당 품목이 존재하는 경우 -1을 그렇지 않은 경우엔 list에 해당 품목을 추가한 후 값을 1로 할당해준다. 

이 후, list의 values 중 값이 0이 아닌 품목이 하나라도 있는 경우 해당 day엔 회원가입이 불가능한 날로 간주한다. 원하는 품목을 다 구매한 경우엔 answer 값을 +1 해준다. 그 후 day + 1을 해주어 다음 회원가입 날짜에 대해 또 다시 while 문을 돌며 판별할 수 있도록 한다.

if(Object.values(list).filter(x => x > 0).length === 0) answer++;
day++;

 

반응형