[42578] 의상 ⭐⭐
태그: cpp, Programmers
카테고리: Programmers
https://school.programmers.co.kr/learn/courses/30/lessons/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;
}
댓글남기기