Publish:

태그: ,

카테고리:

https://school.programmers.co.kr/learn/courses/30/lessons/42578
난이도 ⭐⭐

문제

42578
42578
42578


나의 풀이

오랜만에 경우의 수 문제였다… 경우의 수 곱의 법칙만 알면 문제는 쉽다!

곱의 법칙 : 사건 A가 일어날 경우의 수가 m, 사건 B가 일어날 경우의 수가 n 이라면
두 사건 A, B가 동시에 일어날 경우의 수는 m X n 이다.

일단 옷을 종류별로 갯수를 계산해주고, 각 종류마다 경우의 수를 계산한다. (난 map에 저장했다.)
예를 들어 얼굴에 a, b 2종류의 옷이 있다면 이 옷을 착용할 경우의 수는 a, b, 그리고 둘 다 입지 않을 0 까지 더해서 3이 된다.
그래서 결국 경우의 수는 각각의 옷 종류마다의 갯수 + 1이 된다.
그리고 각 종류마다의 경우의 수를 곱해주면 된다.
주의해야 할 것은 곱해버리면 결국 모두 다 안입게 되는 경우의 수 까지 계산된다는 것이다.
그래서 마지막에 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <string>
#include <vector>
#include <map>
using namespace std;

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

    map<string, int> clothMap;

    // 일단 옷 종류별로 갯수 계산
    for (int i = 0; i < clothes.size(); i++)
    {
        if (clothMap.find(clothes[i][1]) != clothMap.end())
        {
            ++clothMap[clothes[i][1]];
        }
        else
        {
            clothMap.insert({clothes[i][1], 1 });
        }
    }

    // 옷 종류별로 경우의 수 구해주기.......
    // 얼굴에 2종류일 경우..(a, b) .... a, b, 0 -> 3.....
    // second + 1
    for (auto x : clothMap)
    {
        if (answer == 0)
        {
            answer = x.second + 1;
            continue;
        }

        answer *= (x.second + 1);
    }

    // 하나는 꼭 입기 때문에 다 안입는 경우 빼주기
    answer--;

    return answer;
}

이슈 및 공부한 것을 기록해두는 개인 블로그 입니다. 댓글, 피드백 환영합니다 🙂

Update:

댓글남기기