본문 바로가기
Algorithm/프로그래머스(Programmers)

[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 위장

by YWTechIT 2022. 3. 29.
728x90

📍 프로그래머스 2단계 - 위장

문제 보기


이 문제에서의 핵심은 서로 다른 옷의 조합수를 return 하는 것인데, 처음에 부분집합을 사용하여 모든 옷을 입지 않는 경우의 수를 제외하고 로직을 구현하려 했으나 동일 key값에 있는 value는 동시에 입을 수 없기 때문에 부분집합을 사용하지 못했다. 결론적으로 하나의 공식을 이용해서 풀어야 하는데 공식은 다음과 같다. key값마다 의상을 입을 수 있는 경우의 수에서 1을 더해준다. 1을 더해주는 이유는 해당 의상을 입지 않을 수도 있기 때문이다. 모든 key값에 동일하게 공식을 적용하고 마지막에 1을 빼주는데, 그 이유는 스파이는 하루에 최소 한 개의 의상은 입습니다.라는 조건을 통해 모든 옷을 벗지 않는다는 점을 유추할 수 있기 때문이다. 이를 식으로 나타내면 다음과 같다.

728x90

(얼굴에 착용하는 경우의 수 + 1(착용하지 않는 경우의 수)) * (상의를 입는 경우의 수 + 1(상의를 입지 않는 경우의 수)) * (하의를 입는 경우의 수 + 1(하의를 입지 않는 경우의 수)) * (겉옷을 입는 경우의 수 + 1(겉옷을 입지 않는 경우의 수)) - 1이 된다.

 

예를 들어 입출력 예제 #1은 다음처럼 풀 수 있다. 먼저 Map을 사용하여 clotheskey:value 값으로 나타내면 Map(2) { 'headgear' => 2, 'eyewear' => 1 }이고, 여기서 위의 공식을 적용하면 ((2+1) * (1+1)) - 1 = 5로 나타낼 수 있다.

 

그리고 문제를 풀기 위해 처음에는 Object를 사용해서 풀고 두 번째는 Map을 활용하여 풀었는데, 두 로직의 차이점은 value값이 String 형이냐 Number형이냐의 차이다. 이 문제에서는 key에 해당하는 value의 명단이 필요한 것이 아니고 개수가 필요하기 때문에 굳이 Object로 모든 value값을 push하지 않아도 되는 점을 고려하여 Map으로 푸는 것이 더 간결하다고 생각했다.

// Map을 활용하여 푼 코드
function solution(clothes) {
  const map = new Map();
  let answer = 1;

  for (const [, category] of clothes) {
    map.set(category, (map.get(category) || 0) + 1);
  }

  for (const [, cnt] of map) {
    answer *= cnt + 1;
  }

  return answer - 1;
}

// Object를 활용하여 푼 코드
function solution(clothes) {
  const dict = {};
  let answer = 1;

  for (const [name, category] of clothes) {
    if (!dict[category]) dict[category] = [];
    dict[category].push(name);
  }

  const keys = Object.values(dict);
  for (const type of keys) {
    answer *= type.length + 1;
  }

  return answer - 1;
}
반응형

댓글