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
반응형
'Practice for coding test' 카테고리의 다른 글
프로그래머스 - Level 2. 스킬트리 / JavaScript (js) (0) | 2023.03.01 |
---|---|
프로그래머스 - Level 2. [1차] 캐시 / JavaScript (js) (0) | 2023.02.28 |
프로그래머스 - Level 2. 튜플 / JavaScript (js) (0) | 2023.02.26 |
프로그래머스 - Level 2. 귤 고르기 / JavaScript (js) (0) | 2023.02.25 |
프로그래머스 - Level 2. 점프와 순간 이동 / JavaScript (js) (0) | 2023.02.24 |