컴공 일기201
게시글 주소: https://dev.orbi.kr/00059269553
오늘 공부했던 구조는 우선순위 큐. 순위를 인지하고 무엇을 먼저 큐에서 꺼낼 것이냐는 문젠데, 큐의 응용이라고 볼 수 있죠. 재미있는 구조입니다. 내가 우선적으로 꺼내고 싶은 것을 꺼낼 수 있으니까요. 대신 논리는 꽤 어려운 측면이 있습니다.
PriorityQueue.h
#pragma once
#ifndef PRIORITYQUEUE_H
#define PRIORITYQUEUE_H
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
typedef struct tagPQNode
{
int Priority;
void* Data;
}PQNode;
typedef struct tagPriorityQueue
{
PQNode* Nodes;
int Capacity;
int UsedSize;
}PriorityQueue;
PriorityQueue* PQ_Create(int InitialSize);
void PQ_Destroy(PriorityQueue* PQ);
void PQ_Enqueue(PriorityQueue* PQ, PQNode NewData);
void PQ_Dequeue(PriorityQueue* PQ, PQNode* Root);
int PQ_GetParent(int Index);
int PQ_GetLeftChild(int Index);
void PQ_SwapNodes(PriorityQueue* PQ, int index1, int index2);
int PQ_IsEmpty(PriorityQueue* PQ);
#endif
PriorityQueue.c
#include "PriorityQueue.h"
PriorityQueue* PQ_Create(int InitialSize)
{
PriorityQueue* NewPQ = (PriorityQueue*)malloc(sizeof(PriorityQueue));
NewPQ->Capacity = InitialSize;
NewPQ->UsedSize = 0;
NewPQ->Nodes = (PQNode*)malloc(sizeof(PQNode) * NewPQ->Capacity);
return NewPQ;
}
void PQ_Destroy(PriorityQueue* PQ)
{
free(PQ->Nodes);
free(PQ);
}
void PQ_Enqueue(PriorityQueue* PQ, PQNode NewNode)
{
int CurrentPosition = PQ->UsedSize;
int ParentPosition = PQ_GetParent(CurrentPosition);
if (PQ->UsedSize == PQ->Capacity)
{
if (PQ->Capacity == 0)
PQ->Capacity = 1;
PQ->Capacity *= 2;
PQ->Nodes = (PQNode*)realloc(PQ->Nodes, sizeof(PQNode) * PQ->Capacity);
}
PQ->Nodes[CurrentPosition] = NewNode;
while (CurrentPosition > 0 && PQ->Nodes[CurrentPosition].Priority < PQ->Nodes[ParentPosition].Priority)
{
PQ_SwapNodes(PQ, CurrentPosition, ParentPosition);
CurrentPosition = ParentPosition;
ParentPosition = PQ_GetParent(CurrentPosition);
}
PQ->UsedSize++;
}
void PQ_SwapNodes(PriorityQueue* PQ, int Index1, int Index2)
{
int CopySize = sizeof(PQNode);
PQNode* Temp = (PQNode*)malloc(CopySize);
memcpy(Temp, &PQ->Nodes[Index1], CopySize);
memcpy(&PQ->Nodes[Index1], &PQ->Nodes[Index2], CopySize);
memcpy(&PQ->Nodes[Index2], Temp, CopySize);
free(Temp);
}
void PQ_Dequeue(PriorityQueue* PQ, PQNode* Root)
{
int ParentPosition = 0;
int LeftPosition = 0;
int RightPosition = 0;
memcpy(Root, &PQ->Nodes[0], sizeof(PQNode));
memset(&PQ->Nodes[0], 0, sizeof(PQNode));
PQ->UsedSize--;
PQ_SwapNodes(PQ, 0, PQ->UsedSize);
LeftPosition = PQ_GetLeftChild(0);
RightPosition = LeftPosition + 1;
while (1)
{
int SelectChild = 0;
//반복문 탈출 조건 배열의 원소 다 살펴봤는데 UsedSize보다 커지면 종료
if (LeftPosition >= PQ->UsedSize)
break;
//오른쪽 인덱스는 경계 밖인데, 왼쪽은 아직 경계 내일 수 있으므로 SelectChild = LeftPosition으로
if (RightPosition >= PQ->UsedSize)
{
SelectChild = LeftPosition;
}
//왼쪽과 오른쪽 모두 USEDSIZE 범위 내에 들어오는 경우라면
else
{
if (PQ->Nodes[LeftPosition].Priority < PQ->Nodes[RightPosition].Priority)
SelectChild = LeftPosition;
else
SelectChild = RightPosition;
}
if (PQ->Nodes[SelectChild].Priority < PQ->Nodes[ParentPosition].Priority)
{
PQ_SwapNodes(PQ, ParentPosition, SelectChild);
ParentPosition = SelectChild;
}
else
break;
LeftPosition = PQ_GetLeftChild(ParentPosition);
RightPosition = LeftPosition + 1;
}
if (PQ->UsedSize < (PQ->Capacity / 2))
{
PQ->Capacity /= 2;
PQ->Nodes = (PQNode*)realloc(PQ->Nodes, sizeof(PQNode) * PQ->Capacity);
}
}
int PQ_GetParent(int Index)
{
return (int)((Index - 1) / 2);
}
int PQ_GetLeftChild(int Index)
{
return (2 * Index + 1);
}
int PQ_IsEmpty(PriorityQueue* PQ)
{
return (PQ->UsedSize == 0);
}
main.c
#include "PriorityQueue.h"
void PrintNode(PQNode* Node)
{
printf("사이트 명 : %s (우선순위:%d)\n", Node->Data, Node->Priority);
}
int main()
{
PriorityQueue* PQ = PQ_Create(3);
PQNode Popped;
PQNode Nodes[5] =
{
{5, (void*)"수만휘"},
{1, (void*)"오르비"},
{4, (void*)"윤통시"},
{3, (void*)"수갤"},
{2, (void*)"포만한"},
};
PQ_Enqueue(PQ, Nodes[0]);
PQ_Enqueue(PQ, Nodes[1]);
PQ_Enqueue(PQ, Nodes[2]);
PQ_Enqueue(PQ, Nodes[3]);
PQ_Enqueue(PQ, Nodes[4]);
printf("큐에 남아 있는 사이트 :%d\n", PQ->UsedSize);
while (!PQ_IsEmpty(PQ))
{
PQ_Dequeue(PQ, &Popped);
PrintNode(&Popped);
}
return 0;
}
실행결과 :
큐에 남아 있는 사이트 :5
사이트 명 : 오르비 (우선순위:1)
사이트 명 : 포만한 (우선순위:2)
사이트 명 : 수갤 (우선순위:3)
사이트 명 : 윤통시 (우선순위:4)
사이트 명 : 수만휘 (우선순위:5)
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
이거 개쩌는 공부법인듯 2 1
1주마다 문제집 제끼고 오르비에 인증하기 앉아있는 시간은 같지만 공부량 ㅈㄴ 늘어난게 체감이 됨
-
윤사 코드원 샀음 1 2
윤사 개박살 났으니까 그래도 김종익 플러스 해서 코드원까지 하려고..
-
전화하고싶다 3 0
누구든좋으니까
-
작년에 2 0
2월부터 수능까지 새르비에 항상 있었던 사람이 있음
-
소아과 의사 누구였지 6 0
오르비언 ㅇㅅㅇ
-
한 달 뒤 새르비 상황 1 3
제목:진짜 다 뒤1졌냐? 2분전 조회수 8 작성자 수능 ㅈ된 설의적표현 내용:
-
???
-
수1 자작 0 1
수열 문제입니다. 거의 국밥 유형인 케이스 분류 문제에요. 오류 발견하시면...
-
아빠 안잔다 2 1
채널 돌리지 마라
-
유튜브하나보고 1 1
마저공부해야지
-
머리 안돌아가서 인강듣는데 2 0
인강도 내용이 잘 안들어옵니다.. 이럴땐 걍 자고 내일할까요?
-
저 누군지 모름? 1 1
구름과자임;;
-
죽었다. 0 0
새르비
-
치통에 4 2
잠을못자는중이에요.. 신경치료각이내
-
유빈이 진짜 야함.. 1 1
거꾸로 하면 빈유임.. 개좋네
-
이원준쌤 문학 괜찮나요? 1 0
ㅈㄱㄴ
-
햄버거 먹음 청년 2 1
슈슈버거세트
-
1회는 13,14 잘 넘기면 어찌어찌 40 중후반대까지 갈 수는 있는데 2회 <-...
-
수행평가로 책 소개하기가 있습니다. 식자경을 희망하고 있어요 책 추천해주실수 있나요
-
실모 만들면 출제자가 시간 세팅해서 딱 올려두고 시간 되면 참여자들이 맞춰서 푼...
-
수학 강사 추천 0 0
수리논술 할거라 미적, 확통, 기하 다 할건데 김범준 VS 정병호 (김범준은 기하...
-
쿠팡플레이 F1 해설위원인 윤재수 해설위원이 서울대 화학과 출신인데... 0 0
서울대 화학부 91학번인데, 1지망을 물리학과(현 물리천문학부 물리학전공) 2지망을...
-
오르비 흰바탕이 왼눈으론 뻘겋고 오른눈으론 누럼
-
차엿어요.. 3 1
...
-
3모 예상등급 0 0
33343정도…국어는 기출 풀기 시작한지 얼마 안 됐고 수학은 미적개념 돌리는...
-
기하러분들 0 0
서프 10번 내적으로 푸시려나
-
컨디션 좋은 상태로 독서실 다시 가고싶어
-
남은게돈뿐이구나 1 0
사람도사랑도식어감…
-
당분간 사립니다
-
난너무간지나서개명신청햇어김간지 0 0
역시난비주류야킥킥
-
지금까지 과학문제집 푼거 제외로 추천하는거있나요? 2 1
기출픽 1등급만들기 오투(개념으로씀) 완자(추가) 메가스터디 N제 자이스토리...
-
맞팔구 0 0
ㅇㅇ
-
반 단톡에서 생일인 사람들 축하해 주던데 그들은 헛걸음질을 하게 될것입니다 ㅋ
-
근데 부엉이껀 챙기면 진짜 개추 ㅋㅋ
-
화작에 2사탐 기준으로요 고대가 표점본다고하긴하던데 백분위로 대충 봐주실수있으신가요...
-
예체능 재순데 올해도 수학 유기하고 수능보면 평생 아쉬울것같아서 수학 지금 시작하고...
-
하쿠 1 0
들으샘
-
내가 그러고 있음 개찐따샛기..
-
이거 대략 현 예상 내 등급 1 2
아마 11313? 아니면 11314? 일듯. 아직 영어는 안 풀긴 했지만. 설마...
-
[Zola] 3월 교육청 대비 0 2
Zola임당. 3월 교육청 대비의 의미없음에 대해서는 아래 영상에서 말씀을...
-
사탐런 고민 3 1
현역이고 작수 물지 당일에 모의수능으로 학원가서쳤을때 2/1떴었는데 사탐런하면...
-
사실 저는 어제 생일이였습니다 왜 말하지 않았냐고요? "모두가 날 신경쓰는척 행동하는게 역겨우니까"
-
옯창 리스트 2 3
-
3월 더프 미적 4 1
21 22 30 틀려서 88점이네
-
과학 문제집중에 7 2
가장 어려운거 뭐임요??
-
야 신난다!
-
자꾸 간봐서 그렇긴 한데 3모 기간이 일정이 뭐가 많아서 아무도 안 볼거면 시간...
-
진지한 국어 질문 7 1
현역때 국어 안했고, 올해 3월에 처음 시작했습니다.선택은 화작목표는 6월에 3등급...
-
[이벤트] 2027학년도 Prologue 모의고사 1회 배포 19 12
OMR 링크:...
-
이제 심판의 시간이 다가왔다 5 2
더프 수학 채점해야 함.

첫번째 댓글의 주인공이 되어보세요.