본문 바로가기
코테연습

172. 할인행사 Javascript

by hxunz 2023. 1. 5.

https://school.programmers.co.kr/learn/courses/30/lessons/131127

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

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

댓글