[프로그래머스] 위장

FeRo 페로·2022년 9월 22일
0

오늘은 프로그래머스 위장 문제를 풀었다. 20분 타이머를 제고 했는데 결국에는 넘겼다.. 아니 다 푼 거 같은데 진짜 마지막 경우의 수로 해결하는 부분에서 아이디어가 떠오르지 않아서 결국엔 희정님께 물어봤다.
프로그래머스 - 위장

핵심은 Map 오브젝트

사실 처음부터 Map을 써야겠다는 생각이 들었다. Map에 있는 has, get, set과 같은 여러 좋은 메소드들을 이용하면 쉽게 풀 수 있을 거 같다는 생각을 했기 때문이다.
일단 두 부분으로 나누어 생각을 했다.

  1. 의상 종류에 따라 갯수를 파악한다.
  2. 갯수를 바탕으로 경우의 수를 계산한다.

Map은 이 첫 번째 부분에서 굉장히 유용했다. [["의상종류","갯수"]...]로 clothes배열을 가공해서 has메소드를 이용해서 의상 종류가 있으면 갯수를 하나 더 해주고 없으면 갯수를 1로 해서 새로 set해주었다.
그렇게 아래와 같은 코드가 나왔다.

마지막에 values메소드로 의상 종류에 따른 갯수까지 추출해두었기 때문에 정말로 다 푼 줄 알았다...

function solution(clothes) {
  const setMap = new Map([]);
  const clothesArr = clothes;
  // 각각의 의상 종류가 몇 개 있는지 확인
  clothesArr.map((el) =>
    setMap.has(el[1])
      ? setMap.set(el[1], setMap.get(el[1]) + 1)
      : setMap.set(el[1], 1)
  );
  const countResult = setMap.values();
}

경우의 수는 어려워..

저렇게 풀고 10분이 흘렀는데 어떻게 해야 할지 전혀 감이 잡히질 않았다. 메모지에 경우의 수를 계산해보면서 머리를 굴려보았지만 생각이 나질 않았다. 구글링을 해볼까 하던 찰나 희정님께 물어봤는데 다행히도 너무 잘 알려주셔서 쉽게 이해를 할 수 있었다.
아래 코드를 통해서 확인해보자.

function solution(clothes) {
  const setMap = new Map([]);
  const clothesArr = clothes;
  // 각각의 의상 종류가 몇 개 있는지 확인
  clothesArr.map((el) =>
    setMap.has(el[1])
      ? setMap.set(el[1], setMap.get(el[1]) + 1)
      : setMap.set(el[1], 1)
  );
  const countResult = setMap.values();
  
  let answer = 1;
  for (let a of countResult) {
    // 그 의상 종류를 입지 않았을 때를 추가해주어야 한다.
    answer *= a + 1;
  }
  // 아무런 의상을 입지 않은 경우를 하나 빼주어야 한다.
  return answer - 1;
}

입지 않은 경우의 수를 포함해야 하기 때문에 바지가 2개라면 2를 곱해주는 것이 아니라 입지 않는 경우를 더해 3을 곱해주어야 하는 것이다. 그리고 의상을 아무것도 입지 않는 경우가 하나 있기 때문에 마지막에 그 경우를 하나 빼주어야 했다. 이 부분을 생각해내지 못해서 20분을 헤매다니ㅜㅜ;

profile
주먹펴고 일어서서 코딩해

0개의 댓글