[JS|해시] 프로그래머스 131127번. 할인 행사

2024. 8. 18. 05:49·💾 자료구조 & 알고리즘/문제 풀이

 

 

프로그래머스

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

programmers.co.kr

 


1. 입력과 출력

  • 입력
    • 정현이가 원하는 제품을 나타내는 문자열 배열 want
    • 정현이가 원하는 제품의 수량을 나타내는 정수 배열 number
    • XYZ 마트에서 할인하는 제품을 나타내는 문자열 배열 discount
  • 출력
    • 회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수 return

 

2. 시행착오

  • 출력값 이해를 잘 못함 : 회원 등록 날짜의 총 일수가 아니라 회원 등록 최소 일자를 찾았었다..! (+ 10분)

 

3. 문제 풀이 로직

문제 풀이 로직 설명

  • 회원 등록을 할 수 있는 날짜의 갯수를 세면 된다!

 


  • 제품 목록 want 배열과 가격 number 배열로 해시테이블 만들어놓기
  let hashTable = new Object()

  // 1. 제품 목록 want배열과 가격 number 배열로 해시테이블 만들어놓기
  want.map((item, idx) => (hashTable[item] = number[idx]))

 

  • 1일차 ~ 10일차 제품들을 미리 해시테이블에서 빼기 (구매할 것들 목록)
  // 2. 1일 차 ~ 10일 차 제품들을 미리 해시테이블에서 빼기 (구매할 것들)
  discount.slice(0, 10).map((item) => {
    if (want.includes(item)) hashTable[item]--
  })

 

 

  • 10개의 제품이 포함되는 일자까지만 반복문 돌기
    • 일자가 지난 제품은 구매하지 않음 : hashTable[이전 일자]++
    • 일자가 다가온 제품은 구매함 : hashTable[다음 일자]--
  // 3. 10개 제품의 목록이 포함되는 일자까지만 반복문 돌기
  let answer = checkDiscount(hashTable) ? 1 : 0
  for (let i = 1; i <= discount.length - 10; i++) {
    hashTable[discount[i - 1]]++ // 이전 제품은 구매 안함
    hashTable[discount[i + 9]]-- // 다음 제품은 구매 함

    // 만약 모든 제품을 구매에 성공하였다면, 해당 일차는 회원등록가능날짜이므로 +1
    if (checkDiscount(hashTable)) answer++
  }
  console.log(answer)
  return answer

 

  • 모든 제품을 구매했는지 확인할 수 있는 헬퍼함수 checkDiscount
    • hashTable 내 제품 중 구매를 하지 못한 ( > 0 ) 제품이 있다면 return false
    • 모든 것을 다 구매하였다면 return true
function checkDiscount(hashTable) {
  for (const Item in hashTable) {
    if (hashTable[Item] > 0) return false
  }
  return true
}

 

 

풀이 시간 및 시간 복잡도 설명

  • 총 60분 풀이
  • 시간복잡도 : O(N)
    • 제품 목록(N)을 돌며 hashTable에 저장함 -> O(N)
    • 할인 제품 목록을 10개 자름 -> O(10)
    • 10개 제품의 목록이 포함되는 일자까지만 반복문 실행 -> O(N-10)

 

 

4. 전체 코드

// 2. 할인 행사
function solution(want, number, discount) {
  let hashTable = new Object()

  // 1. 제품 목록 want배열과 가격 number 배열로 해시테이블 만들어놓기
  want.map((item, idx) => (hashTable[item] = number[idx]))

  // 2. 1일 차 ~ 10일 차 제품들을 미리 해시테이블에서 빼기 (구매할 것들)
  discount.slice(0, 10).map((item) => {
    if (want.includes(item)) hashTable[item]--
  })

  // 3. 10개 제품의 목록이 포함되는 일자까지만 반복문 돌기
  let answer = checkDiscount(hashTable) ? 1 : 0
  for (let i = 1; i <= discount.length - 10; i++) {
    hashTable[discount[i - 1]]++ // 이전 제품은 구매 안함
    hashTable[discount[i + 9]]-- // 다음 제품은 구매 함

    // 만약 모든 제품을 구매에 성공하였다면, 해당 일차는 회원등록가능날짜이므로 +1
    if (checkDiscount(hashTable)) answer++
  }
  console.log(answer)
  return answer
}

function checkDiscount(hashTable) {
  for (const Item in hashTable) {
    if (hashTable[Item] > 0) return false
  }
  return true
}
'💾 자료구조 & 알고리즘/문제 풀이' 카테고리의 다른 글
  • [JS|백트래킹] 프로그래머스 92342번. 양궁대회
  • [JS|백트래킹] 프로그래머스 12952번. N-Queen
  • [JS|해시] 프로그래머스 42576번. 완주하지 못한 선수
  • [JS|구현 알고리즘] 백준 14719번. 빗물
상심한 개발자
상심한 개발자
  • 상심한 개발자
    상심한 개발자
    상심한 개발자
  • 전체
    오늘
    어제
    • 상심한 개발자 (36)
      • 📝 공부 기록 (4)
        • Javascript (3)
        • CS (1)
        • NodeJS (0)
      • 💻 개발 기록 (1)
        • Sring, 스터디 모집 및 관리 기능 통합 서비.. (1)
      • 💾 자료구조 & 알고리즘 (26)
        • 이론 정리 (13)
        • 문제 풀이 (13)
      • 📝 후기 및 회고록 (4)
      • etc. (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    배열
    자료구조
    array
    블로그
    JavaScript
    삽질기록
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상심한 개발자
[JS|해시] 프로그래머스 131127번. 할인 행사
상단으로

티스토리툴바