[Node.js_4기] 코드카타 : 할인행사 (24/03/08)

2024. 3. 11. 09:10공부/코테준비

목차

 

1. 문제

2. 시도

3. 결과

4. 배운점

 

1. 문제 

 

코딩테스트 연습 - 할인 행사 | 프로그래머스 스쿨 (programmers.co.kr)

 

 

2. 시도 

 

function solution(want, number, discount) {
    let answer = 0;
    let jh = new Map();
    let len_want = want.length;
    let len_dis = discount.length;
    for(let i = 0; i<len_want;i++){
        jh.set(want[i],number[i])
    }
    
    for(let j = 0; j<len_dis;j++){
        const jh2 = new Map(jh)
        for(let k = j; k<j+10;k++){
            const item = discount[k];
            if (jh2.has(item)){
                const count = jh2.get(item);
                if(count <= 1){
                    jh2.delete(item);
                }
                else{
                    jh2.set(item,count-1)
                }
            }
        }
        if(jh2.size === 0){
            answer ++
        }
    }    
    return answer;
}

 

3. 결과 

테스트 1 통과 (31.74ms, 37.7MB)
테스트 2 통과 (103.98ms, 40.4MB)
테스트 3 통과 (43.69ms, 38MB)
테스트 4 통과 (67.69ms, 39MB)
테스트 5 통과 (30.26ms, 40.1MB)
테스트 6 통과 (43.51ms, 37.7MB)
테스트 7 통과 (21.52ms, 38.7MB)
테스트 8 통과 (61.08ms, 43.2MB)
테스트 9 통과 (12.11ms, 38.6MB)
테스트 10 통과 (60.92ms, 39.9MB)
테스트 11 통과 (30.41ms, 37.8MB)
테스트 12 통과 (0.27ms, 33.3MB)

 

4. 배운점 

 

Map 함수를 이용하여 푸는 문제입니다.

 

jh라는 이름의 새로운 Map을 생성하고 want 배열의 각 요소와 number 배열의 각 요소를 Map에 추가합니다.

discount 배열을 순회하면서 아래와 같은 로직을 수행합니다.

  • discount 배열을 10개 단위로 잘라서(j부터 j+9까지), 잘린 부분을 jh2라는 새로운 Map에 복사합니다.
  • jh2를 순회하면서 해당하는 상품의 개수를 조사하고, 해당 개수를 갱신합니다.
  • 만약 상품의 개수가 1 이하이면 Map에서 해당 상품을 삭제합니다.
  • 만약 상품의 개수가 1 초과이면 개수를 1 감소시킵니다.
  • 만약 jh2의 크기가 0이 되면(jh2가 비어있다면) answer를 증가시킵니다.
  • 최종적으로 answer를 반환합니다.

이 함수의 목적은 discount 배열의 부분 배열 중에서, 해당 부분 배열에 있는 상품들을 모두 제거하여 want 배열에 있는 상품을 구매할 수 있는 경우의 수를 찾는 것입니다.

결과적으로로 answer에는 discount 배열의 어떤 부분 배열이 want 배열의 상품을 모두 제거하는데 사용될 수 있는지에 대한 경우의 수가 저장됩니다.