# include # include // ÇÁ·Î±×·¥ 5.2¿¡¼­ ´ÙÀ½°ú °°Àº ºÎºÐÀ» º¹»çÇÑ´Ù. // ================ ¿øÇüÅ¥ ÄÚµå ½ÃÀÛ ================= typedef struct { // ¿ä¼Ò ŸÀÔ int id; int arrival_time; int service_time; } element; // ±³Ã¼! // ================ ¿øÇüÅ¥ ÄÚµå Á¾·á ================= // ===== ¿øÇüÅ¥ ÄÚµå ½ÃÀÛ ====== #define MAX_QUEUE_SIZE 100 typedef struct { // Å¥ ŸÀÔ element data[MAX_QUEUE_SIZE]; int front, rear; } QueueType; // ¿À·ù ÇÔ¼ö void error(char *message) { fprintf(stderr, "%s\n", message); exit(1); } // °ø¹é »óÅ °ËÃâ ÇÔ¼ö void init_queue(QueueType *q) { q->front = q->rear = 0; } // °ø¹é »óÅ °ËÃâ ÇÔ¼ö int is_empty(QueueType *q) { return (q->front == q->rear); } // Æ÷È­ »óÅ °ËÃâ ÇÔ¼ö int is_full(QueueType *q) { return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front); } // ¿øÇüÅ¥ Ãâ·Â ÇÔ¼ö // »ðÀÔ ÇÔ¼ö void enqueue(QueueType *q, element item) { if (is_full(q)) error("Å¥°¡ Æ÷È­»óÅÂÀÔ´Ï´Ù"); q->rear = (q->rear + 1) % MAX_QUEUE_SIZE; q->data[q->rear] = item; } // »èÁ¦ ÇÔ¼ö element dequeue(QueueType *q) { if (is_empty(q)) error("Å¥°¡ °ø¹é»óÅÂÀÔ´Ï´Ù"); q->front = (q->front + 1) % MAX_QUEUE_SIZE; return q->data[q->front]; } // »èÁ¦ ÇÔ¼ö element peek(QueueType *q) { if (is_empty(q)) error("Å¥°¡ °ø¹é»óÅÂÀÔ´Ï´Ù"); return q->data[(q->front + 1) % MAX_QUEUE_SIZE]; } // ===== ¿øÇüÅ¥ ÄÚµå ³¡ ====== void customer_service(int banker, int clock, QueueType *queue, int *service_time, int *service_customer, int *total_wait) { if (*service_time > 0) { printf("\t\t\t\t\t ÀºÇà¿ø(%d): °í°´ %2d ¾÷¹«Ã³¸®Áß \n", banker, *service_customer); (*service_time)--; } else { if(*service_customer >=0) printf("\t\t\t\t\t ÀºÇà¿ø(%d): °í°´ %2d ¾÷¹«Á¾·á¡Ú \n", banker, *service_customer); if (!is_empty(queue)) { element customer = dequeue(queue); *service_customer = customer.id; *service_time = customer.service_time; printf("\t°í°´ %2dÀÌ %2dºÐ ½ÃÀÛ ´ë±â½Ã°£=%2dºÐ\n", customer.id, clock, clock - customer.arrival_time); *total_wait += clock - customer.arrival_time; } } } #define NUM_BANKER 3 int main(void) { int minutes = 60; int total_wait = 0; int total_customers = 0; int service_time[NUM_BANKER] = { 0 }; int service_customer[NUM_BANKER] = { -1, -1, -1 }; int num_service; int clock; QueueType queue; init_queue(&queue); srand(34); for (clock = 0; clock < minutes; clock++) { printf("½Ã°¢=%2d\n", clock); if ((rand() % 10) < 7) { element customer; customer.id = total_customers++; customer.arrival_time = clock; customer.service_time = rand() % 10 + 1; enqueue(&queue, customer); printf("\t°í°´ %2dÀÌ %2dºÐ ÀÔÀå ¾÷¹«½Ã°£=%2dºÐ\n", customer.id, customer.arrival_time, customer.service_time); } for (int i = 0; i < NUM_BANKER; i++) { customer_service(i+1, clock, &queue, &service_time[i], &service_customer[i], &total_wait); } num_service = service_customer[0]; for (int i = 1; i < NUM_BANKER; i++) { if (service_customer[i] > num_service) num_service = service_customer[i]; } } printf("Àüü ´ë±â ½Ã°£=%dºÐ \n", total_wait); printf("1Àδç Æò±Õ ´ë±â ½Ã°£=%lfºÐ \n", (double)total_wait/(double)(num_service+1)); return 0; }