https://school.programmers.co.kr/learn/courses/30/lessons/131127
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
회원 등록 시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원 등록 날짜의 총 일수를 구하라 - 주어진 자료는 무엇인가?
want: 정현아기 원하는 제품을 나타내는 문자열 배열
number: 정현이가 원하는 제품의 수량을 나타내는 정수 배열
discount: XYZ 마트에서 할인하는 제품을 나타내는 문자열 배열 - 조건은 무엇인가?
1 ≤ want의 길이 = number의 길이 ≤ 10
1 ≤ number의 원소 ≤ 10
number[i]는 want[i]의 수량을 의미하며, number의 원소의 합은 10입니다.
10 ≤ discount의 길이 ≤ 100,000
want와 discount의 원소들은 알파벳 소문자로 이루어진 문자열입니다.
1 ≤ want의 원소의 길이, discount의 원소의 길이 ≤ 12
2. 계획
- 10일 동안 회원 자격을 부여하니까 discount를 10개 단위로 끊는다.
- 10일 간의 할인 목록 제품 종류별 개수를 구한다.
- 여기에서 할인을 원하는 제품이 없다면 카운트하지 않는다.
- 원하는 제품의 개수가 할인하는 제품의 개수보다 더 적으면 카운트하지 않는다.
- 이 두가지 상황에 해당 안하면 카운트하고 이 카운트 값을 리턴
3. 실행
const solution = (want, number, discount) => {
let answer = 0;
for (let i = 0; i < discount.length; i++) {
if (check(want, number, discount.slice(i, i + 10))) {
answer += 1
}
}
return answer;
};
const check = (want, number, discount) => {
const discountProduct = new Map();
discount.forEach((d) => discountProduct.set(d, (discountProduct.get(d) || 0) + 1));
for (let i = 0; i < want.length; i++) {
if (isNaN(discountProduct.get(want[i]))) {
return false
}
if (number[i] > discountProduct.get(want[i])) {
return false
}
}
return true
}
test('discountAll', () => {
expect(solution(["banana", "apple", "rice", "pork", "pot"], [3, 2, 2, 2, 1], ["chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana"])).toEqual(3);
})
'코테연습' 카테고리의 다른 글
174. 2xn 타일링 (1) | 2023.01.09 |
---|---|
173. 연속 부분 수열 합의 개수 Javascript (0) | 2023.01.06 |
171.귤 고르기 Javascript (0) | 2023.01.04 |
170. 문자열 나누기 Javascript (0) | 2023.01.03 |
167. n^2 배열 자르기 Javascript (0) | 2022.09.22 |
댓글