ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 9375] 패션왕 신해빈
    PS/C++ 2024. 7. 2.

    https://www.acmicpc.net/problem/9375

     

    경우의 수를 찾는 문제

     

    아래 케이스를 살펴보자.

     

    옷의 종류가 3가지이고

    a라는 부위가 3개, b라는 부위가 2개, c라는 부위가 1개라고 가정하면

    총 가능한 경우의 수는

    1가지를 고를 때

    a + b + c개

    2가지를 고를 때

    ab + ac + bc

    3가지를 고를 때

    abc

    이면 총 경우의 수는 위 3가지를 더한 abc + ab + ac + bc + a + b + c가 된다

     

    이를 일반화 하기 위해 인수분해를 해 보면

    a(bc + b + c + 1) + bc + b + c가

    되며 bc + b + c + 1꼴로 만들기 위해 a(bc + b + c + 1) + bc + b + c + 1 - 1로 만든다. bc + b + c + 1 = k로 치환하면

    ak + k - 1이 되고 k(a + 1) - 1이 되는데 k = b(c + 1) + (c + 1)이 되고 다시 c + 1로 인수분해 하면 (c + 1)(b + 1)이 되고 최종적으로 도출된 식은 (a + 1)(b + 1)(c + 1) - 1이 된다.

     

    위 결과를 이용해 옷의 종류가 n가지라 치면

    (1번째 종류의 수 + 1) * (2번째 종류의 수 + 1) * ... * (n번째 종류의 수 + 1) - 1 이 정답이 된다

    #include <bits/stdc++.h>
    #define ll long long
    #define FASTIO ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    using namespace std;
    int main() {
        FASTIO
        int t; cin >> t;
        while(t-->0) {
            int n; cin >> n;
            map<string, int> hmap;
            for(int i = 0; i < n; i++) {
                string a, b; cin >> a >> b;
                if(hmap[b] == 0) {
                    hmap[b] = 1;
                } else {
                    hmap[b]++;
                }
            }
            int res = 1;
            for(auto &current : hmap) {
                res *= (current.second + 1);
            }
    
            cout << res - 1 << '\n';
        }
    }

     

    'PS > C++' 카테고리의 다른 글

    [백준 1004] 어린 왕자  (0) 2024.07.05
    [백준 1707] 이분 그래프  (0) 2024.07.04
    [백준 2108] 통계학  (1) 2024.06.25
    [백준 1062] 가르침  (0) 2024.06.24
    [백준 14504] 수열과 쿼리 18  (0) 2024.06.20

    댓글

Designed by Tistory.