승코딩당당당

[C++] 백준 9375: 패션왕 신해빈 본문

PS/BOJ

[C++] 백준 9375: 패션왕 신해빈

승코딩당당당 2026. 2. 10. 23:48

문제

[C++] 백준 9375: 패션왕 신해빈 SILVER 3
https://www.acmicpc.net/problem/9375

 


 

접근 방법

이 문제는 옷의 이름은 필요 없고, 종류(type)별로 몇 개 있는지만 알면 되는 경우의 수 문제다.

  • 입력으로 (옷 이름, 옷 종류)가 들어오지만, 실제로 필요한 건 “종류별 개수”이기 때문에
    map<string, int>을 사용해서 아래와 같이 저장했다.
    • key : 옷의 종류
    • value: 그 종류에 속하는 옷의 개수

  • 예를 들어, 아래와 같다면 각 종류별 선택지는 다음과 같다.
    • headgear 2개
    • eyewear 1개

    • headgear: (안 씀) + 2개 중 하나 = 3가지
    • eyewear: (안 씀) + 1개 중 하나 = 2가지

따라서, 전체 경우의 수는 3 * 2 = 6이 된다.

이를 일반화하면, 각 종류마다 (해당 종류 개수 + 1)을 모두 곱한 뒤, 마지막에 아무것도 안 입는 경우 1가지를 빼서 -1 해주면 된다.

(2 + 1) * (1 + 1) - 1 = 5

map<string, int> m;
for (int i = 0; i < n; i++) {
    string name, type;
    cin >> name >> type;
    m[type]++;              // 종류별 개수 카운트
}

int ret = 1;
for (auto& p : m)          // 각 종류마다 (개수 + 1)을 곱함
    ret *= (p.second + 1);

cout << ret - 1 << '\n';    // 아무것도 안 입는 경우 제외

 

구현 시 주의할 점

1. for (auto& p : m) 이 문장의 의미

  • m은 map<string, int> 이고, range-based for문에서 p의 타입은 pair<const string, int>가 된다.
  • auto& p
    • auto: 타입을 자동 추론
    • &: 참조로 받아서 복사 비용 줄이기
  • 그래서 아래를 의미한다.
    • p.first → 옷 종류 (key)
    • p.second → 그 종류의 개수 (value)

이번 문제에선 key는 필요 없고, p.second만 사용해서 (p.second + 1)을 곱해준다.

 

2. 경우의 수에서 +1과 -1의 의미

  • +1 :
    각 종류마다 “아예 안 입는 선택지”를 하나 더해주는 것
  • 마지막 -1 :
    모든 종류에서 “안 입는 것”만 고른, 즉 전부 안 입는 경우를 빼주기 위함

 


 

코드

#include <iostream>
#include <map>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int test_case = 0;
    cin >> test_case;
    for (int t = 0; t < test_case; t++)
    {
        int n = 0;
        cin >> n;

        map<string, int> m;
        for (int i = 0; i < n; i++)
        {
            string name, type;
            cin >> name >> type;

            m[type]++;
        }

        int ret = 1;
        for (auto& p : m)
            ret *= (p.second + 1);

        cout << ret - 1 << '\n';
    }

    return 0;
}

'PS > BOJ' 카테고리의 다른 글

[C++] 백준 21736: 헌내기는 친구가 필요해  (0) 2026.02.11
[C++] 백준 11279: 최대 힙  (0) 2026.02.11
[C++] 백준 17219: 비밀번호 찾기  (0) 2026.02.10
[C++] 백준 1456: 거의 소수  (0) 2026.02.10
[C++] 백준 1929: 소수 구하기  (0) 2026.02.03