티스토리 뷰

https://school.programmers.co.kr/learn/courses/30/lessons/42578

 

프로그래머스

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

programmers.co.kr

 

🤔 해결방법

1. 카테고리별 옷의 개수를 세서 객체에 저장 후 개수+1을 모두 곱해서 경우의 수 세기

2. 아무것도 입지 않는 경우는 빼줘야 하니 -1하고 반환

 

 

🔑 풀이

처음 문제를 읽고 과외할 때 풀던 경우의 수 파트가 생각났다.

상의가 3종류, 하의가 4종류일 때 조합할 수 있는 경우의 수는 3X4=12인 이런 류의 문제.

주어진 예제를 보니 이 문제도 이런 식으로 풀기 위해 배열을 순회하며 종류별 아이템 개수를 세서 객체에 저장하고 개수를 곱한 후, 하나씩만 착용도 가능하기 때문에 모든 아이템의 개수를 한 번 더 더해주면 되는 것 같았다.

그래서 다음과 같은 풀이를 제출했다.

 

function solution(clothes) {
      let categoryCounts = {};

      // 배열을 순회하면서 카테고리별 옷의 수 세기
      for (let i = 0; i < clothes.length; i++) {
          let category = clothes[i][1];
          if (categoryCounts[category]) {
              categoryCounts[category]++;
          } else {
              categoryCounts[category] = 1; // {"headgear":2,"eyewear":1}
          }
      }

      // 경우의 수 계산
      let answer = 1;
      for (let count in categoryCounts) {
          answer *= categoryCounts[count]; // 2
      }

      // 하나씩 착용하는 경우 더해주기
      if (Object.keys(categoryCounts).length != 1){
          for (let count in categoryCounts) {
              answer += categoryCounts[count]; // 5
          }
      }

      return answer;
  }

 

하지만 성공으로 뜨는 테스트가 몇 개 없었다.😥

검색해보니 일부 카테고리의 옷을 입지 않는 경우를 포함해야 한다고 했다.

예를 들어 카테고리가 모자, 상의, 하의라면 모자는 착용하지 않고 상의와 하의를 입는 경우인 것이다.

 

그렇다면 경우의 수를 구할 때 각 개수에 입지 않는 경우인 1을 더하고 곱해줘야 했다.

그리고 최소 하루에 한 개의 의상은 입는다고 되어있으므로 아무것도 입지 않는 경우인 1을 빼줘야했다.

최종 코드는 다음과 같다.

function solution(clothes) {
      let categoryCounts = {};

      // 배열을 순회하면서 카테고리별 옷의 수 세기
      for (let i = 0; i < clothes.length; i++) {
          let category = clothes[i][1];
          if (categoryCounts[category]) {
              categoryCounts[category]++;
          } else {
              categoryCounts[category] = 1; // {"headgear":2,"eyewear":1}
          }
      }

      // 경우의 수 계산
      let answer = 1;
      for (let count in categoryCounts) {
          answer *= (categoryCounts[count] + 1);
      }

      return answer-1;
  }

 

나는 for문으로 카테고리별 옷의 수를 셌는데 이 문제가 해시 문제인만큼 다음과 같이 해시맵 사용해 옷의 개수를 세는 코드도 있었다.

let categoryMap = new Map();

  // 각 카테고리별로 옷의 수를 센다
  for(let [name, category] of clothes) {
      categoryMap.set(category, (categoryMap.get(category) || 0) + 1);
  }
댓글