c# 멱집합 구하는 예제 – linq

​어떠한 집합의 원소들로 구성한 집합을 멱집합이라고 한다. 한자로는 羃集合이라고 쓰는데 羃은 ‘덮다’, ‘곱한다’는 뜻이다. 같은 수들을 한 번 곱하면 제곱이라 하고 세 번 이상 곱하면 거듭제곱이라 하며 거듭제곱한 수를 멱수라 한다. 영어로는 power set라 하는데 2^3에서 2를 base라 하고 3을 power라 한다.

이 집합은 왜 이렇게 어려운 이름을 갖게 되었을까? 그 개수가 2를 기본 집합의 원소 수만큼 거듭제곱한 값이기 때문이다. 예를 들어 { 1, 2, 3 }의 멱집합은 { }, { 1 }, { 2 }, { 3 }, { 1, 2 }, { 1, 3 }, { 2, 3 }, { 1, 2, 3 }으로 2^3개 나온다. 아무것도 없는 { }가 포함되는 것에 유의한다.

c#으로는 linq를 이용하여 한 줄로 구현할 수 있다.

private void Form1_Load(object sender, EventArgs e)
{
    List<int> _Ints = new() { 1, 2, 3, 4, 5 };

    IEnumerable<IEnumerable<int>> _Ints_s =  GetPowerSet(_Ints);

    int _Count = default;

    foreach (var item1 in _Ints_s)
    {
        _Count++;

        textBox1.AppendText(_Count.ToString() + " ");

        foreach (var item2 in item1)
        {
            textBox1.AppendText(item2.ToString() + " ");
        }

        textBox1.AppendText("\r\n");
    }
}

public IEnumerable<IEnumerable<T>> GetPowerSet<T>(List<T> _List)
{
    return from m in Enumerable.Range(0, 1 << _List.Count) select from i in Enumerable.Range(0, _List.Count) where (m & (1 << i)) != 0 select _List[i];
}