티스토리 뷰
[주제]
- 주문한 음식이 포장되어 나오기를 기다리는 고객을 위한 대기실을 만드려고 함
[조건]
- 운영 시간은 1시간
- 고객의 첫 주문 이후 15초당 다음 1명씩 주문
- 고객은 총 3가지 햄버거 중 무작위로 1개만 주문가능
- 햄버거 조리 시간(치즈버거 12초, 불고기버거 15초, 더블버거 24초)
- 한 번에 하나의 햄버거만 조리가능
- 조리가 끝나기 전까지 다음 주문을 받지 않음
- 주문 처리가 된 고객은 대기실에서 나옴
[목표]
- 1시간 동안 여러 종류의 햄버거를 요리하는 상황에서 고객을 대기시킬 수 있는 대기실의 크기를 산출하기 위하여 크기에 따라
얼마나 안정적으로 수용할 수 있는지 확률적으로 나타내기
※ 예) 수용인원이 30명인 공간: 안정적으로 고객을 수용할 확률은 50%(시뮬 10회 시도 시 5회 성공, 5회 실패)
[소스코딩]
※ 큐는 이전에 사용한 '배열 기반으로 구현된 원형 큐' 소스를 활용
■ CircularQueue.h
#ifndef CIRCULARQUEUE_H_ #define CIRCULARQUEUE_H_ #define TRUE 1 #define FALSE 0 #define QUE_LEN 100 typedef struct _cQueue { int front; // 삭제할 데이터의 위치를 가리키는 변수 int rear; // 삽입할 데이터의 위치를 가리키는 변수 int queArr[QUE_LEN]; // QUE_LEN 길이를 갖는 큐 배열 } CQueue; typedef CQueue Queue; void QueueInit(Queue * pq); // 큐 초기화 함수 int QIsEmpty(Queue * pq); // 큐에 데이터가 존재하는지 확인하는 함수 void Enqueue(Queue * pq, int data); // 큐에 데이터를 저장하는 함수 int Dequeue(Queue * pq); // 큐의 데이터를 반환하는 함수 int QPeek(Queue * pq); // 큐의 데이터를 조회하는 함수 #endif | cs |
- 'QUE_LEN'을 대기실 공간으로 사용
■ CircularQueue.c
#include <stdio.h> #include <stdlib.h> // exit 함수를 사용하기 위함 #include "CircularQueue.h" // 큐 초기화 함수 // void QueueInit(Queue * pq) { pq->front = 0; pq->rear = 0; } // 큐에 데이터가 존재하는지 확인하는 함수 // int QIsEmpty(Queue * pq) { if(pq->front == pq->rear) return TRUE; else return FALSE; } // 큐의 다음 위치에 해당하는 배열의 인덱스 값을 반환하는 함수 // int NextPosIdx(int pos) { if(pos == QUE_LEN-1) return 0; else return pos+1; } // 큐에 데이터를 저장하는 함수 // void Enqueue(Queue * pq, int data) { if(NextPosIdx(pq->rear) == pq->front) { printf("Queue Memory FULL!!"); exit(-1); } pq->rear = NextPosIdx(pq->rear); pq->queArr[pq->rear] = data; } // 큐의 데이터를 반환하는 함수 // int Dequeue(Queue * pq) { if(QIsEmpty(pq)) { printf("Queue Memory Empty!!"); exit(-1); } pq->front = NextPosIdx(pq->front); return pq->queArr[pq->front]; } // 큐의 데이터를 조회하는 함수 // int QPeek(Queue * pq) { if(QIsEmpty(pq)) { printf("Queue Memory Empty!!"); exit(-1); } return pq->queArr[NextPosIdx(pq->front)]; } | cs |
■ HamburgerSim.c
#include <stdio.h> #include <stdlib.h> // rand, srand 함수를 사용하기 위함 #include <time.h> // time 함수를 사용하기 위함 #include "CircularQueue.h" #define CUS_COME_TERM 15 // 고객의 주문 간격: 초 단위 #define CHE_BUR 0 // 상수: 치즈버거 #define BUL_BUR 1 // 상수: 불고기버거 #define DUB_BUR 2 // 상수: 더블버거 #define CHE_TERM 12 // 조리 시간(sec): 치즈버거 #define BUL_TERM 15 // 조리 시간(sec): 불고기버거 #define DUB_TERM 24 // 조리 시간(sec): 더블버거 int main(void) { int makeProc = 0; int cheOrder = 0, bulOrder = 0, dubOrder = 0; int sec; Queue que; QueueInit(&que); srand(time(NULL)); for(sec=0; sec<3600; sec++) { if(sec % CUS_COME_TERM == 0) { switch(rand() % 3) { case CHE_BUR: Enqueue(&que, CHE_TERM); cheOrder += 1; break; case BUL_BUR: Enqueue(&que, BUL_TERM); bulOrder += 1; break; case DUB_BUR: Enqueue(&que, DUB_TERM); dubOrder += 1; break; } } if(makeProc <= 0 && !QIsEmpty(&que)) makeProc = Dequeue(&que); makeProc--; }
return 0; } | cs |
■ main 함수 설명
int makeProc = 0; int cheOrder = 0, bulOrder = 0, dubOrder = 0; int sec; Queue que; QueueInit(&que); srand(time(NULL)); | cs |
- 조리대 앞 대기를 체크할 변수 'makeProc' 선언 및 초기화
- 주문 개수를 체크할 변수 'cheOrder, bulOrder, dubOrder' 선언 및 초기화
- 시간을 체크할 변수 'sec' 선언
※ 1당 1초로 가정
- 큐 생성 및 초기화
- 고객이 무작위로 주문할 때 난수가 고정적이지 않게 'srand, time'함수를 사용. 1초가 지날 때마다 새로운 시드 값을 결정
※ srand: rand함수는 시드(seed)라는 값에의해 생성되므로 시드값을 설정을 해주지 않아 고정된 같은 시드값으로 실행이되어
최초에만 무작위로 결정됨. 이를 해결하기 위해서 srand함수를 이용하여 시드값을 설정
※ time(NULL): 1970년 1월 1일 이후의 경과된 시간을 초 단위로 반환
for(sec=0; sec<3600; sec++) { if(sec % CUS_COME_TERM == 0) { switch(rand() % 3) { case CHE_BUR: Enqueue(&que, CHE_TERM); cheOrder += 1; break; case BUL_BUR: Enqueue(&que, BUL_TERM); bulOrder += 1; break; case DUB_BUR: Enqueue(&que, DUB_TERM); dubOrder += 1; break; } } if(makeProc <= 0 && !QIsEmpty(&que)) makeProc = Dequeue(&que); makeProc--; } | cs |
--- 주문 처리에 대한 반복문 시작 ---
- 3600회(=3600초. 1시간)를 반복
// 현재 지난 시간(sec)을 15(CUS_COME_TERM)로 나눈 나머지가 0일 경우 = 15초가 지났을 경우
- 무작위로 0~2 사이의 값을 결정(햄버거 3가지 중 1개를 주문)
※ 0(CHE_BUR), 1(BUL_BUR), 2(DUB_BUR)
- 결정된 햄버거의 조리 시간을 알고 있는 고객을 대기실(큐. que)에 넣고 주문 개수를 증가시킨 뒤 switch 종료
// 주문 후 조리대 앞에 아무도 없고(makeProc == 0), 대기실(큐)에 고객이 존재할 경우
- 대기실(큐)에서 나와서(반환) 조리대 앞으로 가서 대기
--- 주문 처리에 대한 반복문 종료 ---
printf("Simulation Report!! \n\n"); printf("[Order Count]\n"); printf("- Cheese Burger: %d \n", cheOrder); printf("- Bulgogi Burger: %d \n", bulOrder); printf("- Double Burger: %d \n\n", dubOrder); printf("※ Waiting room size: %d \n", QUE_LEN); return 0; | cs |
- 햄버거 종류별로 주문 개수와 대기실의 크기를 출력
■ 실행결과
※ 1회 실행결과이며, 큐의 활용 이해만 넘어가기 위해 세부적인 반복은 테스트만 하고 넘어감
'자료구조' 카테고리의 다른 글
[ch 08-1] 트리의 개요 (0) | 2016.04.13 |
---|---|
[ch 07-5] 덱의 이해와 구현 (0) | 2016.04.12 |
[ch 07-3] 큐의 연결 리스트 기반 구현(구현) (0) | 2016.04.09 |
[ch 07-2] 큐의 배열 기반 구현_2(구현) (0) | 2016.04.08 |
[ch 07-2] 큐의 배열 기반 구현_1(데이터 저장/반환, 원형 큐 개념) (2) | 2016.04.08 |
- Total
- Today
- Yesterday
- ADODB
- 스택
- 일기
- 상황
- java
- RA
- 응용
- Pte
- 독해
- wfd
- SWT
- 문법
- Delphi
- 영어
- System
- 말하기
- 자료구조
- 대상
- 설명
- Reference
- VCL
- 왕초보 영어회화 100일의 기적
- 정렬
- SysUtils
- 알고리즘
- 계산기
- 여행영어 100일의 기적
- 교육센터
- 작문
- tdataset
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |