프로그래머스 | 의상 조합 경우의 수

chaen·2024년 2월 5일
post-thumbnail

📌 문제

P는 매일 다른 옷을 조합하여 코디합니다. 각 종류 별로 최대 1가지만 착용할 수 있으며, 최소 하루 한 개의 의상은 입습니다. 착용한 의상이 완전 똑같지 않다면 일부가 겹치더라도 다른 방법으로 간주합니다. 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 함수를 작성해주세요.

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.

입출력 예시

clothesreturn
["hat", "headgear"], ["sunglasses", "eyewear"], ["turban", "headgear"]5
["crow_mask", "face"], ["sunglasses", "face"], ["smoky_makeup", "face"]3

✨ 해결 방법

경우의 수를 따지는 문제입니다. 단순히 조합의 수를 구하므로, 각 아이템의 이름보다는 같은 종류별로 몇 개가 있는지가 중요합니다.
만약 안경 종류의 아이템이 3개일 경우, 경우의 수는 아이템 1, 아이템 2, 아이템 3, 안 쓸 경우로 총 4가지가 나옵니다. (4P1)
한 종류와 다른 종류를 동시 착용하는 경우이므로 각 종류의 경우의 수를 구하여 곱셈합니다.
다만, 아무것도 입지 않을 수 없기 때문에 해당 경우를 제거하는 의미로 1을 빼줍니다.

💻 solution 1

function solution(clothes) {
    let answer = 1;
    let comb = new Map();
    clothes.forEach((cloth)=>{
        comb.set(cloth[1], (comb.get(cloth[1])||0) + 1);
    })

    comb.forEach (count => {
        answer *= (count + 1);
    })
    
    return answer - 1;
}

comb 라는 새로운 맵에 각 종류와, 개수를 저장합니다. forEach 문을 사용하여 clothes를 순회하는데, 각 아이템의 이름이 아닌 종류를 구해야 하므로 1번째 (0번째 무시) 만 받아 comb에 넣고 갯수를 1씩 증가시킵니다.
모두 순회하여 종류 별 갯수가 구해졌다면, 이번엔 comb를 순회합니다.
착용하지 않을 경우를 포함해 value 값에 1을 더하고, 그 값을 answer 에 곱하여 누적합니다.
마지막으로 모두 안 입을 경우를 제외하여 -1을 한 값을 리턴합니다.

0개의 댓글