위장

[프로그래머스] 위장


문제 링크

여러 옷 카테고리와 그에 해당하는 옷들이 주어지고, 그들의 조합의 개수를 구하는 문제이다.
문제 조건에서 적어도 하나의 옷은 입는다는 말이 있다. 이말인즉슨 하나의 카테고리만 입을 수도 있고, 여러 카테고리를 입을 수도 있다는 뜻이다.
각 카테고리의 조합을 구하기 보다, 옷을 아예 입지 않는 경우를 포함한 경우의 수를 구하고 여기에 1을 빼는 방법이 훨씬 간단하고 구현하기 쉽다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <string>
#include <vector>
#include <map>

using namespace std;

int solution(vector<vector<string>> clothes) {
    int answer = 1;

    map<string, int> cmap;

    for(int i=0; i<clothes.size(); ++i) {
        auto iter = cmap.find(clothes[i][1]);
        if(iter != cmap.end())
            ++iter->second;
        else
            cmap.insert({clothes[i][1], 1});
    }

    // "각 카테고리의 옷 개수 + 해당 카테고리의 옷을 입지 않는 경우의 수(1)" 의
    // 누적 곱을 구한다.
    for(auto iter=cmap.begin(); iter!=cmap.end(); ++iter)
        answer *= iter->second + 1;

    return answer - 1;
}
0%