경우의 수를 활용하자.

November 22, 2023 (1y ago)

해쉬 맵을 이용한 경우의 수

문제는 코니가 갖고 있는 옷장의 옷의 종류에 따라 코니가 코디할 수 있는 코디의 개수에 대한 경우의 수를 구하는 문제이다.

얼굴 : 동그란 안경, 검정 선글라스 -> 2가지

상의 : 파란색 티셔츠 -> 1가지

하의 : 청바지 -> 1가지

겉옷 : 긴 코트 -> 1가지

문제에 대한 코드는 다음과 같다.

function solution(clothes) {
  const map = new Map();
  for (const [cloths, type] of clothes) {
    map.set(type, (map.get(type) ?? 0) + 1);
  }

  let sum = 1;
  for (const count of [...map.values()]) {
    sum *= count + 1;
  }
  return sum - 1;
}

위의 경우 Map을 사용하여 각 type에 따라 몇개의 옷을 지니고 있는지에 대해서 개수를 나누었다. 그 이후 나뉘어진 개수를 기반으로 몇 가지의 경우의 수를 구할 수 있는지를 계산한다.

경우의 수를 생각할 때 count + 1 의 의미에 대해서 생각해보자. 카운트는 각각의 옷을 선택했을 경우에 대한 것을 의미한다. 하지만 여기서 한 가지 선택지가 더 존재해야 하는데 옷을 선택하지 않았을 경우에 대한 경우의 수를 생각해야 한다. 모자 한 가지를 선택하였을 경우에 대한 것과 두 가지가 있다고 하면 모자 두 가지를 선택 했을 경우 마지막으로 아무것도 선택하지 않았을 경우에 대한 것을 계산해야 하는 것이다.

그리고 마지막으로 sum 에서 1을 빼는 것은 옷을 아무것도 입지 않았을 경우가 위의 계산에서 포함되기 때문이다. 옷을 입는 것에 대한 경우의 수를 구하는 것이기 때문에 아무것도 입지 않았을 경우에 대한 케이스는 없어야 한다.

중요시 해야할 것

프로그래밍에 있어서 수학은 기본기이다. 수학에 대한 공부를 소홀히 하지 말자. 이번 문제에서 얻을 수 있었던 점은 무엇인가?

  1. 독립적인 사건일 경우 각각의 사건은 곱셈으로 계산이 되어야 한다.
  2. 독립적인 사건이 아닌 경우 각각의 사건은 덧셈으로 계산이 되어야 한다.
  3. 경우의 수는 모든 경우에 대한 계산이 이루어져야 한다. 모든 것을 포함하는 것과 모든 것을 포함하지 않는 경우 또한 계산이 이루어져야 한다.

이외에도 확률과 통계는 프로그래밍에 있어서 굉장히 많이 사용되기 때문에 더 자세하게 공부할 필요가 있다.