난이도: Lv.2
문제: https://school.programmers.co.kr/learn/courses/30/lessons/131127
알고리즘
1. want 배열과 number 배열로 원하는 제품의 수량이 몇 개인지에 대한 객체를 생성한다. 이 객체를 원본이라 하자.
2. 객체의 원본을 깊은 복사한 객체를 생성한다.
3. discount 배열에서 연속된 10개의 항목을 순회하며 항목이 객체의 키 값으로 존재하는지 확인한다.
3-1. 하나의 항목이라도 객체의 키 값으로 존재하지 않으면 원하는 제품을 모두 할인받을 수 없으므로 discount 배열의 시작 인덱스를 다음으로 옮긴다.
3-2. 객체의 키 값으로 존재한다면 복사본 객체에서 해당 항목의 value를 하나 감소시킨다. 객체의 모든 value들이 0이면 회원가입을 할 수 있음을 의미한다.
4. 복사한 객체의 모든 value들이 0인지 확인한다. 3-1 경우에서 break 했기 때문에 value 값이 양수인 것도 존재한다. 따라서 find의 조건은 0 보다 큰 원소를 찾는 것이다. find의 결과가 존재하지 않으면, 즉 모든 원소들이 0 이면 회원가입을 할 수 있는 날이므로 정답 변수인 answer을 증가시킨다.
function solution(want, number, discount) {
var answer = 0;
const wantObj = {};
for (let i = 0; i < want.length; i++) {
wantObj[want[i]] = number[i];
}
for (let i = 0; i < discount.length - 9; i++) {
let cmpObj = Object.assign({}, wantObj);
for (let j = i; j < i + 10; j++) {
if (!Object.hasOwn(cmpObj, discount[j])) { break; }
cmpObj[discount[j]]--;
}
const values = Array.from(Object.values(cmpObj));
const lack = values.find((num) => num > 0);
if (!lack) { answer++; }
}
return answer;
}
주저리
테스트케이스 12번만 통과되길래 우르르쾅쾅 키보드 칠 뻔 하다가 복사한 객체 출력해보고는 원본 객체가 훼손된 것을 알았다. Object.assign(원본객체)는 얕은 복사다. 깊은 복사하려면 Object.assign({}, 원본객체) 라고 써야 한다.
'코딩테스트' 카테고리의 다른 글
[JS] 의상 (0) | 2023.12.10 |
---|---|
[JS] H-Index (0) | 2023.12.08 |
[JS] n^2 배열 자르기 (0) | 2023.12.06 |
[JS] 괄호 회전하기 (0) | 2023.12.05 |
[JS] 연속 부분 수열 합의 개수 (0) | 2023.12.04 |