Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 2870번 수학숙제
- 프로그래머스
- 2870번
- 백준
- c++
- Unity
- 백준 c++ 2468번
- 백준 17070번
- 백준 17070번 c++
- 백준 1103번 게임
- Algorithm
- 백준 2870번
- 백준 c++ 2870번
- 2870번 수학숙제 c++
- 백준 1103번
- 2870번 c++
- 플레이어 이동
- 2468 c++
- 코테
- dfs
- Beakjoon
- 오브젝트 풀링
- Lv.3
- 17070번
- 코딩테스트
- C#
- 유니티
- 수학숙제
- Lv2
- 백준 1103번 c++
Archives
- Today
- Total
주녘공부일지
[C# Reference] 우선순위 큐 ( Priority Queue ) + Heap 본문
DataClass PriorityQueue
// 데이터 추가해서 사용
public class DataClass
{
public int cost;
public DataClass(int cost)
{
this.cost = cost;
}
}
// DataClass의 cost를 기준으로 가장 작은 값을 우선으로 두는 우선순위 큐
public class PriorityQueue
{
private List<DataClass> heap = new List<DataClass>();
public int Count => heap.Count;
public void Enqueue(DataClass data)
{
heap.Add(data);
int now = heap.Count - 1; // 추가한 노드 위치
while (now > 0)
{
int next = (now - 1) / 2; // 부모 노드 (트리)
if (heap[now].cost > heap[next].cost)
break;
// 부모노드보다 추가한게 같거나 작으면 Swap
DataClass temp = heap[now];
heap[now] = heap[next];
heap[next] = temp;
now = next;
}
}
public DataClass Dequeue()
{
DataClass ret = heap[0]; // 리턴 값
int lastIndex = heap.Count - 1;
heap[0] = heap[lastIndex];
heap.RemoveAt(lastIndex);
lastIndex -= 1;
int now = 0;
while (true)
{
int left = 2 * now + 1;
int right = 2 * now + 2;
int next = now;
// 왼쪽보다 크면 왼쪽으로 보내기
if (left <= lastIndex && heap[next].cost > heap[left].cost)
next = left;
// 오른쪽보다 크면 오른쪽으로 보내기
if (right <= lastIndex && heap[next].cost > heap[right].cost)
next = right;
if (next == now)
break;
DataClass temp = heap[now];
heap[now] = heap[next];
heap[next] = temp;
now = next;
}
return ret;
}
}
PriorityQueue<T>
// 최소 값을 우선으로 두는 우선순위 큐
public class PriorityQueue<T> where T : IComparable<T>
{
private List<T> heap = new List<T>();
public int Count => heap.Count;
public void Enqueue(T data)
{
heap.Add(data);
int now = heap.Count - 1; // 추가한 노드 위치
while (now > 0)
{
int next = (now - 1) / 2; // 부모 노드 (트리)
if (heap[now].CompareTo(heap[next]) > 0)
break;
// 부모노드보다 추가한게 같거나 작으면 Swap
T temp = heap[now];
heap[now] = heap[next];
heap[next] = temp;
now = next;
}
}
public T Dequeue()
{
T ret = heap[0]; // 리턴 값
int lastIndex = heap.Count - 1;
heap[0] = heap[lastIndex];
heap.RemoveAt(lastIndex);
lastIndex -= 1;
int now = 0;
while (true)
{
int left = 2 * now + 1;
int right = 2 * now + 2;
int next = now;
// 왼쪽보다 크면 왼쪽으로 보내기
if (left <= lastIndex && heap[next].CompareTo(heap[left]) > 0)
next = left;
// 오른쪽보다 크면 오른쪽으로 보내기
if (right <= lastIndex && heap[next].CompareTo(heap[right]) > 0)
next = right;
if (next == now)
break;
T temp = heap[now];
heap[now] = heap[next];
heap[next] = temp;
now = next;
}
return ret;
}
}
'Programming > Definition, Etc' 카테고리의 다른 글
[C#] 이벤트 (Event) + 표준 이벤트 패턴, 이벤트 접근자&수정자 (0) | 2023.11.15 |
---|---|
[C#] 대리자(delegate) vs 인터페이스(interface) (0) | 2023.11.10 |
[C#] 대리자 (Delegate - Action, Func) (0) | 2023.11.10 |
[C#] 제네릭 (Generic) (0) | 2023.10.27 |
[C#] 열거형 (enum type) (1) | 2023.10.15 |