문제
옷이 이름과 종류로 주어진다.
같은 종류의 옷은 동시에 입을 수 없고, 하루에 최소 한 가지 이상 입어야 한다.
가능한 모든 옷 조합의 수를 구하는 문제.

https://www.acmicpc.net/problem/9375
접근 방법
이 문제의 핵심은 종류별 옷 개수를 세고,
각 종류마다 입는 경우 + 안 입는 경우를 계산해서
모든 종류를 곱한 뒤, 아무것도 안 입는 경우를 빼는 것이다.
풀이 과정
Dictionary<string, int>를 사용해 종류별 개수를 저장.
입력을 받을 때, 같은 종류가 이미 있으면 ++, 없으면 = 1.
모든 종류를 순회하면서 (count + 1)을 곱함.
마지막에 -1 해서 아무것도 안 입는 경우 제거.
예시
3
hat headgear
sunglasses eyewear
turban headgear
headgear: 2
eyewear: 1
(2 + 1) × (1 + 1) = 3 × 2 = 6
6 - 1 = 5
작성한 코드
using System;
using System.Collections.Generic;
namespace backjoon
{
internal class Program
{
static void Main()
{
int t = int.Parse(Console.ReadLine()); // 테스트 케이스 개수
for (int i = 0; i < t; i++)
{
int n = int.Parse(Console.ReadLine()); // 옷의 개수
Dictionary<string, int> clothes = new Dictionary<string, int>();
for (int j = 0; j < n; j++)
{
string[] input = Console.ReadLine().Split();
string type = input[1];
if (clothes.ContainsKey(type))
clothes[type]++;
else
clothes[type] = 1;
}
int result = 1;
foreach (var count in clothes.Values)
{
// 안 입는 경우 + 입는 경우
result *= (count + 1);
}
Console.WriteLine(result - 1); // 아무것도 안 입는 경우 제거
}
}
}
}
배운 점
Dictionary<string, int>로 종류별 개수를 관리하면 편리하다.
(count + 1)은 안 입는 경우를 포함시키기 위함이다.
마지막에 -1은 모든 종류를 안 입는 경우를 제외하기 위함이다.
clothes.Values를 쓰면 Dictionary의 값(Value)만 순회할 수 있다.