[프로그래머스] 위장 - JavaScript

Chloé·2022년 3월 8일
0
post-thumbnail

위장 #해시

출처 - 프로그래머스 코딩테스트 고득점 KIT

💡 문제 접근하기

  • 조합을 구해야 하는 것처럼 보이지만, 사실은 경우의 수를 구하는 문제.

경우의 수 구하기:

  1. 각 의상을 종류별로 분류한다.
    • 예를 들어, 모자 3개, 상의 2개, 하의 2개, ….
  2. 각 종류별로 의상을 고르는 경우의 수를 구한다.
    • 각 의상의 종류마다 해당 종류의 의상의 갯수에 1을 더한 경우가 존재한다. 해당하는 의상을 고르지 않는 경우도 세어줘야 하기 때문!
    • 모자의 경우를 예로 들면, 모자1, 모자2, 모자3, 모자를 고르지 않는 경우로 총 4가지 경우가 나온다.
  3. 각 종류별로 의상을 고르는 경우의 수를 모두 곱해준다.
  4. 모든 경우의 수에서 아무것도 입지 않은 경우를 제외한다.
    • 모든 경우의 수에서 1을 빼준다.
    • 모자를 고르지 않는 경우 & 상의를 고르지 않는 경우 & 하의를 고르지 않는 경우가 여기에 해당한다.

🔥 문제 풀어보기

첫 번째 방법

function solution(clothes) {
  let answer = 1;

  // step 1. 해시맵을 생성한다.
  let sH = new Map;

  // step 2. 주어진 의상을 해시맵에 매핑한다.
  for (let [value, key] of clothes) {
      sH.set(key, sH.get(key) + 1 || 1);
  }

  // step 3. 해시맵의 원소들을 순회하며 경우의 수를 곱한다.
  for (let [key, value] of sH) {
      // console.log(`${key}는 ${value}개 있다!`)
      answer *= (value + 1);
  }

  // step 4. 전체 경우에서 1을 뺀 값을 정답으로 출력한다.
  answer -= 1;

  return answer;
}

두 번째 방법: reduce 사용

function solution(clothes) {
  
  // STEP 1. 주어진 의상 배열을 순회하며 각 의상을 종류별로 분류해 해시맵에 맵핑한다.
  let cH = new Map();

  for (let [item, type] of clothes) {
    cH.set(type, cH.get(type) + 1 || 1);
  }

  // STEP 2. 해시맵을 순회하며 각 종류별로 옷을 고르는 경우의 수를 구해 곱한다.
  let answer = [...cH.values()].reduce((acc, cur) => {
    return acc * (cur + 1);
  }, 1);

  // STEP 3. 모든 경우의 수에서 아무것도 입지 않는 경우 한 가지를 뺀다.
  answer = answer - 1;

  return answer;
}

🚀 문제에서 배워보기

Map 순회하기

  • Map도 Object처럼 .keys(), .values()로 값들을 반환할 수 있다.
    • 단, 사용하는 방법이 다르다! Object.keys(myObj) / myMap.keys() 모양에 주의해서 보자.
  • 그러나 Object.keys()array를 반환하는 것과 달리, Map.keys()Map Iterator 라는 Object를 반환한다.
    • 크롬 브라우저 콘솔에서는 MapIterator {'key1', 'key2'} 를 반환한다.
    • 프로그래머스 실행 콘솔에서는 [Map Iterator] { 'key1', 'key2' } 를 반환한다.
profile
클로이 데일리 로그

0개의 댓글