C¾ð¾î °ü·ÃÇؼ­..Áú¹®ÀÌ ÀÖ½À´Ï´Ù.

   Á¶È¸ 2792   Ãßõ 0    

안녕하세요. 매번 질문만 올리는 학부생 안개속영원입니다. 

http://www.2cpu.co.kr/QnA/674147 (원글)




뭔가 더 고민을 해봤습니다. 

해주신 조언을 기반으로 해서 CircularQueue.c , CircularQueue.h 파일 내에서 발생하는 오류는 대부분 잡았습니다. (무아님 감사합니다!)

이제 다음 문제를 해결하려고 하는데..우선 치즈버거,불고기버거, 더블버거의 요리시간은 2분 3분 5분으로 정했고, 주문 간격은 3분으로 정했습니다. 

대기시간이란게 요리 완료 시간까지 포함하는 것이 아니고, 주문 후 요리를 시작하기 전 까지의 시간이라 생각하고 계산을 했습니다.

(즉 요리시간 - 주문 간격 = 주문자가 대기하는 시간) 

그리고 계산을 좀 편하게 하기 위해서 일정한 간격(3분)에 단순히 한 종류의 버거를 주문한다 가정하고 정리하니

치즈버거 요리시간 - 주문 간격 = 2-3 =-1

불고기버거 요리시간 - 주문 간격 = 3-3 = 0 (대기시간 없음)

더블버거 요리시간 - 주문 간격 = 5-3 = 2 (대기시간 2분)

이런 결과가 나왔습니다. 

마이너스 값이 나온걸 보면..이걸 예외처리로 빼야 할 것 같은데 어떻게 코드로 옮길지가 문제네요.

그리고 평균 값도 처음에는 (대기시간 * 주문수)/주문수 이렇게 생각해서 작성했는데 오류가 발생하구요.

3번째 문제는 랜덤으로 주문간격을 주면 될 것 같은데 그랬다간 대기시간이 3분을 기준했을 때와는 달라지니까 그것도 고민이구요.

4번은 큐를 더 늘려야 하는지 (주방의 수를 늘리는 것.)외에 좋은 방법이 있을까요?

sim.c

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <stdlib.h>          // rand, srand 함수를 사용하기 위함
#include <time.h>            // time 함수를 사용하기 위함
#include "CircularQueue.c"
#define CUS_COME_TERM  3  // 고객의 주문 간격: 초 단위
 
#define CHE_BUR     0        // 상수: 치즈버거
#define BUL_BUR     1        // 상수: 불고기버거
#define DUB_BUR     2        // 상수: 더블버거
 
#define CHE_TERM    2       // 조리 시간(sec): 치즈버거
#define BUL_TERM    3       // 조리 시간(sec): 불고기버거
#define DUB_TERM    5       // 조리 시간(sec): 더블버거
 
int main(void)
{
    int makeProc=0;
    int cheOrder = 0, bulOrder = 0, dubOrder = 0;
    int min;
    Queue que;
    double waittingTime=0;
 
    QueueInit(&que);
    srand(time(NULL));
 
 // 대기시간 = 현재시간 - 도착시간 
    for(min=0; min<60; min++)
    {
        if(min % CUS_COME_TERM == 0)
        {
            switch(rand() % 3)
            {
                case CHE_BUR:
                    Enqueue(&que, CHE_TERM);
                   
                    waittingTime=-1;
                    cheOrder += 1;
                    break;
 
                case BUL_BUR:
                    Enqueue(&que, BUL_TERM);
                    
                    waittingTime=0;
                    bulOrder += 1;
                    break;
 
                case DUB_BUR:
                    Enqueue(&que, DUB_TERM);
                    
                    waittingTime=2;
                    dubOrder += 1;
                    break;
            }
        }
 
        if(makeProc <= 0 && !QIsEmpty(&que))
           { makeProc = Dequeue(&que);
           
            } 
 
        makeProc--;
        
    }
 
    printf("Simulation Report!! \n\n");
    printf("- 치즈버거 주문시 평균 대기시간 : %0.1f \n", (waittingTime*cheOrder)/cheOrder);
    printf("- 고기버거 주문시 평균 대기시간 : %0.1f \n", (waittingTime*bulOredr)/bulOrder);
    printf("- 더블버거 주문시 평균 대기시간 : %0.1f \n\n", (waittingTime*dubQrder)/dubOrder);
 
 
    return 0;
}
 
 
cs


CircularQueue.c , CircularQueue.h

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#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].cookingTime = data;
}
 
// 큐의 데이터를 반환하는 함수 //
int Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    pq->front = NextPosIdx(pq->front);
    return pq->queArr[pq->front].cookingTime;
}
 
 
 
cs


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
#ifndef CIRCULARQUEUE_H_
#define CIRCULARQUEUE_H_
 
#define TRUE     1
#define FALSE    0
 
#define QUE_LEN  100
 typedef struct Data{
     
     int cookingTime;
     int arrivalTime;
 }Data;
 
typedef struct _cQueue
{
    int front;                       // 삭제할 데이터의 위치를 가리키는 변수
    int rear;                        // 삽입할 데이터의 위치를 가리키는 변수
    Data 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);             // 큐의 데이터를 반환하는 함수
 
#endif
 
cs


디버그 결과입니다.

고수님들의 가르침 기다리겠습니다.



ªÀº±Û Àϼö·Ï ½ÅÁßÇÏ°Ô.
¹Ú°æ¿ø 2018-11
³²ÀÌ ÁÖ¹®ÇÑ ¿ä¸®¸¦ ³²ÀÌ ¹Þ¾Ò´Âµ¥ ³» ´ë±â½Ã°£ÀÌ ÁÙ¾îµå´Â°Ç ¾Æ´ÏÁö ¾Ê½À´Ï±î
Àú ¹æ½ÄÀ¸·Î °è»êÇÑ ÁÖ¹®ÀÚÀÇ ´ë±â½Ã°£¿¡¼­ ¸¶À̳ʽº °ªÀÌ ³ª¿Ô´Ù´Â°Ç ±× ¸ðµ¨ÀÌ Á¤È®ÇÏÁö ¾Ê´Ù´Â°É ÀǹÌÇÕ´Ï´Ù
³»°¡ °¡°Ô¿¡ °É¾îµé¾î°¡ À½½ÄÀ» ÁÖ¹®ÇÏ´Â ÁÖ¹®ÀÚ¶ó »ý°¢ÇÏ°í °úÁ¤À» ÇÑ ¹ø µû¶ó°¡º¸¸é µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù
°íÄ¡±â Èûµç ¸¹Àº ¹ö±×µéÀº state¿Í °ü·ÃµÈ °ÍµéÀÔ´Ï´Ù... ²Ä²ÄÈ÷ ºÁ¾ß corner case¸¦ ³õÄ¡Áö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù
¹«¾Æ 2018-11
Ä¡Áî¹ö°Å ¿ä¸®½Ã°£ - ÁÖ¹® °£°Ý = 2-3 =-1
¿¡¼­ ¸¶À̳ʽº°¡ ³ª¿À´Â °ÍÀº.. ÁÖ¹æÀÌ 1ºÐµ¿¾È ³î°í ÀÖ´Ù°í Çؼ®ÇÏ°í ´ë±â½Ã°£Àº 0 À̶ó°í ó¸®Çؾ߰ÚÁÒ.


QnA
Á¦¸ñPage 1450/5687
2014-05   4998506   Á¤ÀºÁØ1
2015-12   1534338   ¹é¸Þ°¡
2018-11   2657   newretrowave
2018-11   3407   ¾Ë¼±¾÷ü
2018-11   2447   Åë½Åº¸¾È
2018-11   2608   »¡°£ºÒ
2018-11   3443   È­¶õ
2018-11   6014   ±è°Ç¿ì
2018-11   1981   ±è°Ç¿ì
2018-11   8446   À̹®¿µ
2018-11   3836   SXWHVa
2018-11   3739   ÀüÁø
2018-11   2392   µé°í¾çÀÌ
2018-11   2622   ÀüÁø
2018-11   3113   Ȩ¼­¹ö°¡µ¿Áß
2018-11   3395   °¡»óÈ­°øºÎÁß
2018-11   2879   ÀÓ½ÃÇö
2018-11   2793   ¾È°³¼Ó¿µ¿ø
2018-11   2793   Àεð°í
2018-11   2628   Artofalgori¡¦
2018-11   3424   ¹Ý¼º¸¸
2018-11   3350   Nikon