[백준 9375] 패션왕 신해빈 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
의상의 종류별 개수가 주어질 때, 서로 다른 옷을 조합하여 입을 수 있는 경우의 수를 구하는 문제입니다.
각 종류마다 최대 한 개의 의상만 착용할 수 있으며, 특정 종류를 착용하지 않는 것도 가능합니다.
단, 아무것도 입지 않는 경우는 제외합니다.
접근법
각 종류별로 독립적인 선택을 하므로 곱셈 원리를 적용합니다.
각 의상 종류마다 해당 종류의 의상을 하나 입거나 입지 않는 선택이 가능하므로 (개수 + 1)가지 경우의 수를 가집니다.
모든 종류에 대해 (개수 + 1)을 곱하면 전체 조합의 수가 나옵니다.
이때 아무것도 입지 않는 경우 1가지가 포함되어 있으므로, 최종 결과에서 1을 빼줍니다.
먼저 해시맵을 사용하여 각 종류별 의상 개수를 카운트합니다.
C#에서는 Dictionary<string, int>를, C++에서는 unordered_map<string, int>를 사용합니다.
이후 각 종류별로 (개수 + 1)을 곱한 뒤 마지막에 1을 빼서 출력합니다.
Code
C#
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
using System;
using System.Collections.Generic;
namespace Solution {
class Program {
static void Main(string[] args) {
var t = int.Parse(Console.ReadLine()!);
var answers = new int[t];
for (var i = 0; i < t; i++) {
var n = int.Parse(Console.ReadLine()!);
var closet = new Dictionary<string, int>();
for (var j = 0; j < n; j++) {
var input = Console.ReadLine()!.Split();
var kind = input[1];
if (!closet.ContainsKey(kind)) closet[kind] = 0;
closet[kind]++;
}
var combinations = 1;
foreach (var count in closet.Values)
combinations *= (count + 1);
answers[i] = combinations - 1;
}
Console.WriteLine(string.Join("\n", answers));
}
}
}
C++
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
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t; cin >> t;
while (t--) {
int n; cin >> n;
unordered_map<string, int> closet;
while (n--) {
string name, kind; cin >> name >> kind;
closet[kind]++;
}
int combinations = 1;
for (const auto& entry : closet)
combinations *= (entry.second + 1);
cout << combinations - 1 << "\n";
}
return 0;
}