valleycho-tech 2025. 3. 9. 20:01

문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 접근)
최소 한가지 이상의 의상을 입고, 서로 다른 옷의 조합의 수를 return 하도록 되어있습니다.
이 문구에서 의상이 무엇인지 보다는 의상의 타입의 갯수가 중요하다는 것을 알 수 있습니다. 그래서 해시맵을 이용하여, 의상 종류의 갯수가 몇개 인지 파악하는 방식으로 접근하면 됩니다.

 

정답 및 풀이

정답

function solution(clothes) {
    let answer = 1;
    const map = new Map();
    
    for (let i = 0; i < clothes.length ;i++) {
        let [cloth, clothType] = clothes[i];
        
        if (map.has(clothType)) {
            map.set(clothType, map.get(clothType) + 1);
        } else {
            map.set(clothType, 1);
        }
    }
    
    for (const [key, value] of map) {
        answer *= (value + 1)
    }
    
    return answer - 1;
}

 

풀이

문제 접근법에서 의상이 무엇인지 보다 의상의 타입의 갯수를 파악하는게 중요하므로 clothes를 해시맵의 담아둡니다.

그리고 반복문을 돌아 해당 의상 타입의 종류가 해시맵에 있으면 그 갯수를 가져와 + 1을 더해주고 없으면, 1의 데이터를 넣어주도록 하였습니다.

입출력의 예
1번 입출력 예)

clothes: [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] 
return : 5

설명: headgear 2종류, eyewear 1종류가 있고, 최소 1종류 이상 입을 수 있다고 했으므로 eyewear 1종류를 선택하고 의상을 입지 않는이라는 아무것도 안입는 선택지도 한가지 더 있습니다. 그러므로 (2+1) * (1+1) = 6이라는 결과 값이 나오고, 최소 한가지 의상은 입는다고 했으므로 -1을 해주어 6-1 = 5라는 결과 값이 출력됩니다.

2번 입출력 예)
clothes: [["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]]
return : 3

설명: face의 3종류가 있으므로, 1번 입출력 예에서 설명한 방식대로 (3+1) - 1 = 3이라는 결과 값이 출력됩니다.