FE PARADISE

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

자료구조 & 알고리즘

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

PARADISE247 2025. 1. 11. 12:37
반응형
 

프로그래머스

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

 

반응형