ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 9375 (패션완 신해빈) c++
    백준 문제 2022. 7. 29. 01:04
    728x90

    문제

     

    9375번: 패션왕 신해빈

    첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로   (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.

    www.acmicpc.net

    옷의 종류가 n개 주어지면 종류가 겹치지 않는 선에서 아무것도 입지 않은 상태를 제외한 경우의 수를 구하는 문제

    입니다.

    예를 들어 n = 3이고 옷의 종류가 다음과 같이 주어지면

    hat headgear
    sunglasses eyewear
    turban headgear

     

    (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses) 와 같이 5가지의 경우의 수가 나올 수 있습니다.

     

    따라서 다른 종류끼리 조합을 생각해 보아야 합니다.

    위의 예시를 보면 

    <headgear>

    hat

    turban

     

    <eyewear>

    sunglasses

     

    1개의 옷만 입을경우

    {hat}, {turban}, {sunglasses}

     

    2개의 옷을 입을경우

    {hat, sunglasses}, {turban, sunglasses}

     

    이를 살펴보면 종류가 같으면 조합을 할 수 없으므로 옷의 종류별로 모아 조합을 생각해야합니다.

    <headgear> 에서의 옷을 선택할 가지수는 총 3가지 입니다. {hat}, {turban} 그리고 아예 선택하지 않을 경우의 수를 고려하면 총 3가지가 나옵니다.마찬가지로 <eyewear> 에서는 선택할 가지수는 총 2가지 입니다. {sunglasses} 와 아예 선택하지 않을 경우의 수

     

    그렇게 조합의 식을 해보면 3 * 2 = 6이 됩니다.하지만 정답은 5입니다. 다시 생각해보면 우리가 각 종류마다 아예 선택하지 않을 경우의 수도 고려해주었기 때문에 모든 종류마다 옷을 선택하지 않으면 발가벗게 되므로 이러한 경우의 수는 마지막에 1개 빼줘야 합니다.따라서 (3 * 2) - 1 = 5가 됩니다.

     

    점화식을 세워 보면 각각의 종류별로 수를 세어 그 수에 1을 더하고 종류별로 곱하고 마지막에 1을 빼주면 됩니다.

    우리는 옷의 종류만 필요하므로 옷의 종류를 map에 넣어줍니다. 

    map을 중복을 허용하지 않으므로 새로 들어온 종류가 이미 map에 있다면 해다 종류를 ++ 해줍니다.

    그 다음 각 종류마다 +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
    44
    45
    46
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <string>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <cmath>
    #include <map>
    #include <set>
    #include <tuple>
    #define MAX 2100000000
    #define inf LONG_MAX
    #define big(a, b) a > b ? a : b
    using namespace std;
    using ll = long long;
    using ull = unsigned long long;
    map<stringint > m;
    int n;
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
        int t;
        cin >> t;
        while (t--) {
            int cnt = 1;
            cin >> n;
            for (int i = 0; i < n; i++) {
                pair<stringstring>p;
                cin >> p.first >> p.second;
                if (m.find(p.second) == m.end())
                    m.insert({ p.second,1 });
                else m[p.second]++;
            }
            for (auto iter : m) {
                cnt *= (iter.second + 1);
            }
            cnt--;
            cout << cnt << '\n';
            m.clear();
        }
     
     
        return 0;
    }
     
    cs
Designed by Tistory.