1. HashSet.Add() 중복 허용 여부

HashSet<T>의 Add 메서드는 중복된 값을 허용하지 않습니다.

  • 동작 원리: HashSet은 내부적으로 해시 테이블을 사용하여 데이터를 저장하며, 동일한 값(동일한 해시 값과 동등성을 가진 값)을 추가하려고 하면 false를 반환하고 값을 추가하지 않습니다.
  • 예제:
HashSet<string> aaa = new HashSet<string>();

bool added1 = aaa.Add("Hello"); // 반환값: true (값이 추가됨)
bool added2 = aaa.Add("Hello"); // 반환값: false (중복된 값, 추가되지 않음)

Console.WriteLine(added1); // true
Console.WriteLine(added2); // false

2. HashSet의 주요 용도

HashSet<T>는 주로 다음과 같은 상황에서 사용됩니다:

1) 중복 제거

  • HashSet은 중복된 값을 허용하지 않으므로, 중복 요소를 제거하고 고유한 값을 유지해야 할 때 적합합니다.
  • 예제:
     
string[] items = { "apple", "banana", "apple", "orange", "banana" };
HashSet<string> uniqueItems = new HashSet<string>(items);

foreach (var item in uniqueItems)
{
    Console.WriteLine(item);
}
// 출력: apple, banana, orange

2) 빠른 검색

  • HashSet은 **O(1)**의 시간 복잡도로 항목을 검색합니다. 대량의 데이터를 처리하면서 특정 값의 존재 여부를 빠르게 확인해야 할 때 유용합니다.
  • 예제:
     
HashSet<int> numbers = new HashSet<int> { 1, 2, 3, 4, 5 };

if (numbers.Contains(3))
{
    Console.WriteLine("3이 존재합니다.");
}

3) 집합 연산

  • HashSet은 집합 연산(합집합, 교집합, 차집합)을 효율적으로 처리할 수 있는 메서드를 제공합니다.
    • 합집합: UnionWith
    • 교집합: IntersectWith
    • 차집합: ExceptWith
    • 대칭 차집합: SymmetricExceptWith
  • 예제:
     
HashSet<int> set1 = new HashSet<int> { 1, 2, 3 };
HashSet<int> set2 = new HashSet<int> { 2, 3, 4 };

set1.IntersectWith(set2); // 교집합: { 2, 3 }

foreach (var item in set1)
{
    Console.WriteLine(item); // 출력: 2, 3
}

4) 데이터 필터링

  • 중복된 데이터를 제거하거나 특정 조건에 맞는 고유 데이터를 필터링하는 데 활용됩니다.

3. 장점

  • 빠른 성능: HashSet은 값의 추가, 삭제, 검색이 평균적으로 **O(1)**의 시간 복잡도를 가집니다.
  • 중복 방지: 값의 고유성을 보장합니다.
  • 집합 연산 지원: 데이터 처리 시 유용한 집합 연산을 제공합니다.

4. 단점

  • 순서가 없음: HashSet은 요소의 순서를 보장하지 않습니다. 순서가 중요한 경우 List 또는 SortedSet을 사용하는 것이 적합합니다.
  • 추가적인 메모리 사용: 내부적으로 해시 테이블을 유지하기 때문에 메모리 사용량이 상대적으로 많을 수 있습니다.

5. 결론

HashSet<T>는 중복 제거와 빠른 검색이 필요한 상황, 또는 집합 연산을 효율적으로 수행하려는 경우에 매우 유용합니다. 단, 순서가 필요하지 않은 데이터를 처리할 때 적합합니다.

+ Recent posts