KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (487)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • programmers
  • C++
  • 문자열
  • Level 2
  • LeetCode
  • C
  • recursion
  • 그래프
  • 백준
  • codeup
  • 제코베 JS 100제
  • js
  • Level 1
  • tree
  • 정렬
  • Level 0
  • 다이나믹 프로그래밍
  • string
  • Level1
  • 수학

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun
PS/Programmers

Programmers / Level 2 / 할인 행사 / JS

PS/Programmers

Programmers / Level 2 / 할인 행사 / JS

2023. 1. 28. 18:57

< 문제 바로가기 >

 

프로그래머스

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

programmers.co.kr

 

/**
 * 원하는 제품명과 제품수량들이 담긴 각각의 리스트를 받아서  
 * key:제품명, value:제품수량을 가지는 Map으로 초기화 하는 함수
 * 
 * @param {string[]} want 원하는 제품명들이 담긴 리스트
 * @param {number[]} number 원하는 제품수량들이 담긴 리스트
 * @param {Map} wantCountMap 초기화할 Map
 */
function initWantCountObject(want, number, wantCountMap) {
  const WANT_LIST_LENGTH = want.length;

  let [wantProduct, wantCount] = ['', 0];
  for (let i = 0; i < WANT_LIST_LENGTH; i += 1) {
    [wantProduct, wantCount] = [want[i], number[i]];

    wantCountMap.set(wantProduct, wantCount);
  }
}

/**
 * start부터 end일까지 할인 품목을 Map의 key값으로 가지는 value를 마이너스 시키는 함수
 * 
 * @param {Map} wantCountMap key:제품명, value:제품수량을 가지는 Map
 * @param {string[]} discount 할인 품목 리스트
 * @param {number} start 회원 등록 일
 * @param {number} end 회원 자격이 끝나는 일
 */
function updateMinusCount(wantCountMap, discount, start, end) {
  let discountProduct = '';
  for (let i = start; i < end; i += 1) {
    discountProduct = discount[i];

    if (wantCountMap.has(discountProduct)) {
      wantCountMap.set(discountProduct, wantCountMap.get(discountProduct) - 1);
    }
  }
}

/**
 * 조건을 만족하는 회원 등록이 가능한 날인지 판단해서 boolean 값을 반환하는 함수
 * 
 * @param {Map} wantCountMap 제품 수량을 모두 업데이트
 * @returns {boolean} 회원 등록이 가능한 날이면 true 반환 
 */
function isPossibleDay(wantCountMap) {
  let result = 0;

  result = [...wantCountMap.values()].every((count) => count <= 0);

  return result;
}

function solution(want, number, discount) {
  const MEMBERSHIP_PERIOD = 10;
  const MAX_START_DAY = discount.length - MEMBERSHIP_PERIOD;
  let result = 0;
  let wantCountMap = new Map();

  let [start, end] = [0, 0];
  for (let i = 0; i <= MAX_START_DAY; i += 1) {
    [start, end] = [i, i + MEMBERSHIP_PERIOD];

    initWantCountObject(want, number, wantCountMap);
    updateMinusCount(wantCountMap, discount, start, end);

    if (isPossibleDay(wantCountMap)) {
      result += 1;
    }
  }

  return result;
}

 

크게 어렵지 않은 문제였다.

처음엔 Object를 이용하려다가, Map 자료구조를 이용했다.

 

원하는 제품명을 key로 가지고, 그 제품을 원하는 수량을 value로 가지는 Map을 만들었다.

그리고 회원 자격은 10일동안만 유지되기 때문에 회원 등록일을 하루씩 늘려가며 이 날에 회원 등록을 했을 때 모든 조건을 충족할 수 있는지 검사했다.

 

검사할때 every() 배열 메소드를 사용했는데, 배열의 모든 element가 조건을 모두 충족하면 true, 하나라도 충족하지 않는다면 false를 반환하기 때문에 이 문제에 적합했다.

여기서 조건엔 Map의 value가 0 이하인것을 판단하는 조건을 걸어주었는데, 이 조건을 걸어준 이유가 할인 품목 리스트를 순회하면서 Map에 있는 품목일 경우 그 value값을 1씩 빼주었기 때문이다.

따라서 value값이 0이하가 된다면 자기가 원하는 수량은 모두 살 수 있다는 뜻이므로 0이하를 판단하는 조건을 걸어주었다.

 

다른 사람들의 코드를 보면 간단히 한 코드도 많은데, 최대한 기능을 나누어서 함수를 작성해보았다.

나름 만족스러운 코드이다!

저작자표시 (새창열림)

'PS > Programmers' 카테고리의 다른 글

Programmers / Level 2 / 모음사전 / JS  (0) 2023.01.31
Programmers / Level 2 / 방문 길이 / JS  (0) 2023.01.29
Programmers / Level 2 / 연속 부분 수열 합의 개수 / JS  (0) 2023.01.27
Programmers / Level 2 / [3차] 압축 / JS  (0) 2023.01.25
    'PS/Programmers' 카테고리의 다른 글
    • Programmers / Level 2 / 모음사전 / JS
    • Programmers / Level 2 / 방문 길이 / JS
    • Programmers / Level 2 / 연속 부분 수열 합의 개수 / JS
    • Programmers / Level 2 / [3차] 압축 / JS
    KimMinJun
    KimMinJun

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.