| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- System Programming
- multi-thread
- Online Judge
- PS
- 독서
- Toy Project
- BOJ
- c#
- Data Structure
- Unity
- C++
- git
- Network Programming
- Today
- Total
I'm FanJae.
[20260514] C# ( HashSet<T> ) 본문
1) 정의
- HashSet은 중복을 허용하지 않는 자료구조이다.
- 내부적으로 해시 기반 구조를 사용하고 있다.
- 데이터의 저장 순서를 보장하지 않으며, 특정 데이터가 존재하는지 빠르게 확인할 때 자주 사용한다.
2) 필요한 이유
- HashSet은 중복 방지와 빠른 검색이 필요할 때 사용한다.
- 예를 들어, List를 사용하면 특정 값이 있는지 확인하기 위해 앞에서부터 순차적으로 탐색해야 한다.
List<int> numbers = new List<int> {1,2,3,4,5};
bool result = numbers.Contains(5);
- 하지만, HashSet은 해시 기반 구조를 사용하기 때문에 특정 데이터의 존재 여부를 빠르게 확인할 수 있다.
HashSet<int> numbers = new HashSet<int> {1,2,3,4,5};
bool result = numbers.Contains(5);
2-1) 사용 예시
- 상당히 많은 곳에 사용할 수 있지만 핵심은 중복 데이터 방지에 있다.
- 방문 여부 체크, 중복 닉네임 검사 등등 여러가지 목적으로 활용 가능하다.
3) 주요 동작
3-1) Add()
- HashSet에 데이터를 추가한다.
- 이미 같은 값이 있으면 추가되지 않는다. (중복 데이터 미허용)
- 추가에 성공하면 true, 이미 존재하면 false를 반환한다.
HashSet<int> set = new HashSet<int>();
bool result1 = set.Add(1);
bool result2 = set.Add(2);
bool result3 = set.Add(1);
Console.WriteLine(result1); // 출력 : True
Console.WriteLine(result2); // 출력 : True
Console.WriteLine(result3); // 출력 : False
3-2) Contains()
- HashSet 안에 특정 데이터가 존재하는지 확인한다.
- 존재하면 true, 없으면 false를 반환한다.
HashSet<int> set = new HashSet<int> { 1, 2, 3 };
bool result = set.Contains(2); // 2가 존재하는지 확인
Console.WriteLine(result); // 출력 : True
3-3) Remove()
- HashSet 에서 특정 데이터를 제거한다.
- 제거에 성공하면 true, 해당 값이 없으면 false를 반환한다.
HashSet<int> set = new HashSet<int> { 1, 2, 3};
bool result1 = set.Remove(2);
bool result2 = set.Remove(5);
Console.WriteLine(result1); // 출력 : True
Console.WriteLine(result2); // 출력 : False
3-4) Count
- 현재 HashSet에 들어 있는 데이터 개수를 반환한다.
- 중복 값은 저장되지 않기 때문에 개수에도 포함되지 않는다.
HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(2);
set.Add(3);
Console.WriteLine(set.Count); // 출력 :
3-5) Clear()
- 현재 HashSet에 들어 있는 모든 데이터를 제거한다.
HashSet<int> set = new HashSet<int> { 1, 2, 3 };
set.Clear();
Console.WriteLine(set.Count); // 출력 : 0
4) 활용 예시
4-1) 방문 체크
HashSet<int> visited = new HashSet<int>();
int node = 1;
if(!visited.Contains(node)
{
visited.Add(node);
Console.WriteLine("방문 처리");
}
- 이처럼, HashSet을 이용해서 방문한 노드를 삽입하여, 다시 처리하지 않도록 막을 수 있다.
4-2) 상태 이상 중복 방지
HashSet<int> statusEffects = new HashSet<string>();
string effect = "position";
if (statusEffects.Add(effect))
{
Console.WriteLine("독 상태 적용");
}
else
{
Console.WriteLine("이미 독 상태입니다.");
}
- 이와 같이 이미 상태 적용 중인 경우를 HashSet을 이용해서 처리하는 것도 가능하다.
5) 주의점
- HashSet은 저장 순서를 보장하지 않고, 인덱스로 접근이 불가능하다.
- 정렬된 데이터가 필요하면 List나 SortedSet을 사용해야 한다.
6) 정리
- 정렬된 데이터가 필요하면 List나 SortedSet을 사용해야 한다.
- HashSet은 중복을 허용하지 않는다.
- Stack이나 Queue가 데이터를 꺼내는 순서와 관련된 부분에 초점이 맞춰져 있는 반면, HashSet은 중복 방지와 빠른 검색에 초점을 두고 있다.
- 따라서 중복 데이터를 막아야 하는 상황이나 특정 데이터의 존재 여부, 방문 여부를 체크할 때 HashSet이 유용하다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260515] C# ( Action ) (0) | 2026.05.15 |
|---|---|
| [20260515] C# ( Delegate, 대리자 ) (0) | 2026.05.15 |
| [20260514] C# ( Queue<T> ) (0) | 2026.05.14 |
| [20260514] C# ( Stack<T> ) (0) | 2026.05.14 |
| [20260513] C# ( Hash 기반 자료구조의 주의점과 이를 해결하는 기법) (0) | 2026.05.13 |