Practice for coding test

프로그래머스 - Level 2. 할인 행사 / JavaScript (js)

Gray Park 2023. 2. 27. 11:30
728x90
반응형

문제설명

문제분석

이 문제는 입력으로 주어진 discount를 10개씩 끊어 순회하며, want의 모든 항목을 구매할 수 있는 날짜가 언제언제인지 날짜의 일수를 구하는 문제입니다.

  • discount를 10개씩 순회한다.
  • want 배열에 담긴 속성이고, 해당 항목을 number에서 제거하지 않았다면
    • number에서 해당 항목을 -1 한다.
    • 카운트를 +1 한다.
  • count가 10이면 answer에 1을 더한다

문제를 단순화 했으니 이해하기 쉽게 코드를 짜보겠습니다.

이해하기 쉽게 코드작성하기

function solution(want, number, discount) {
    let numbers = [];
    let answer = 0, count = 0;
    
    for(let i = 0; i <= discount.length - 10; i++) {
    	// number를 여러번 사용하므로 복사해서 사용
        numbers = [...number];
        // i부터 10번째 항목까지 생성
        const stuff = discount.slice(i, i + 10);
        for(const el of stuff) {
            const idx = want.indexOf(el);
            if(idx === -1) continue;
            // 원하는 요소를 아직 구매하지 않았다면 카운트
            if(numbers[idx] > 0) {
                numbers[idx]--;
                count++;
            }
        }
        if(count === 10) answer++;
        count = 0;
    }
    
    return answer;
}

 

반응형

조금 깔끔하게 보기 위해 정리를 먼저 하면, count를 for문 내부에 선언하여 사용하는 방법이 있습니다. 그 외에는 모듈화를 통해 내부 for문을 별도의 함수로 빼도 좋겠네요. 변경해보겠습니다.

function solution(want, number, discount) {
    let answer = 0;
    
    for(let i = 0; i <= discount.length - 10; i++) {
        // i부터 10번째 항목까지 생성
        const stuff = discount.slice(i, i + 10);
        if(isMatch(want, [...number], stuff)) answer++;
    }
    
    return answer;
}

// discount의 모든 항목이 want 항목의 갯수와 일치하는지 확인
function isMatch(want, number, discount) {
	for(const el of discount) {
        const idx = want.indexOf(el);
        if(idx === -1 || number[idx] === 0) return false;
        number[idx]--;
    }
    return true;
}

객체로 변환해서 비교도 해봤지만, 인덱스만 알면 어차피 비교할 수 있기때문에 굳이 변환하진 않겠습니다. (저는 변환해서 해봤지만 성능이 더 우수하진 않았습니다.)

 

728x90
반응형