문제

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

걸린 시간

01 : 38 : 35 실패

풀이

C++

#include <bits/stdc++.h>
#define INF 987654321
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
    while(tc--){
        int n; // 의상 수
        cin >> n;
        string dress, kind;
        map<string, int> m;
        for(int i = 0; i < n; i++){
            cin >> dress >> kind;
            // 따로 key, value 를 쌍으로 추가하지
            // 않아도 value 값은 항상 0으로
            // 초기화 되어있는 것 같다.
            m[kind] += 1;
        }
        int ans = 1;
        for(auto it = m.begin(); it != m.end(); it++)
            ans *= it->second+1;
        cout << ans-1 << "\n";
    }
    return 0;
}

의상을 map 을 이용해서 종류별로 모두 정리해두고 답을 어떻게 구해야할 지 고민했다.

next_permutation stl 을 이용하여 모든 부분집합을 구해 가능한 모든 경우의 수를 구해야 하는가 싶었다.

그렇게 삽질을 하다 1시간이 넘어갔고 풀이가 너무 복잡한게 방향을 잘못 잡은것 같아 다른 사람의 답을 보니 정말 간단했다.

각 종류별로 의상의 개수에 1씩을 더하여 모두 곱해준 후 1을 뺀 값이 정답이다.

1씩을 더해주는건 입지 않았을 경우를 말하고, 계산된 결과에서 1을 빼는건 아무것도 입지 않는 경우이다.

아래 첨부한 블로그에 설명이 잘 되어있다.

참고

'Baekjoon' 카테고리의 다른 글

Baekjoon 17626번 Four Squares  (0) 2020.08.29
Baekjoon 11727번 2xn 타일링 2  (0) 2020.08.28
Baekjoon 2579번 계단 오르기  (0) 2020.08.28
Baekjoon 1676번 팩토리얼 0의 개수  (0) 2020.08.28
Baekjoon 1780번 종이의 개수  (0) 2020.08.28

댓글