ATM을 사용하기 위해 대기중인 손님들의 대기시간을 최소화 해보자
가장 먼저 생각해야할 것은 대기중인 손님들의 시간을 최소화 하기 위해서 무엇을 해야하는가이다. 무작위의 대기시간을 가진 손님들의 총 합산 값이 가장 작게 하기 위해서는 대기시간이 작은 손님부터 먼저 시작을 하는게 가장 효율이 좋다. 그렇게 뒷 사람들의 대기시간이 줄어들기 때문이다.
이것을 위해 정렬 알고리즘을 이용해서 오름차순으로 정렬을 해주었다.
//------------정렬해주는 부분------------
for (int j = 0; j < People; j++)
{
for (int i = 0; i < People-1; i++)
{
if (time[i] > time[i + 1])
{
swap = time[i];
time[i] = time[i + 1];
time[i + 1] = swap;
}
}
}
손님들의 대기시간은 해당 손님의 앞 사람의 업무시간에 영향을 받는다. 예를 들어 1분/2분/3분 이라면 3번째 손님은 3분의 대기시간과 자기가 사용하는 3분의 시간을 합쳐 총 6분을 사용하게 된다. 이처럼 앞에 사람들의 시간에 자기 시간을 더해주면 해당 손님의 시간이된다. 이를 위해 반복문을 통해 앞으로 나아가면서 합산을 진행시켜주었다.
//----------앞으로 나아가며 합산---------
for (int i = 0; i < People; i++)
{
for (int j = 0; j <= i; j++)
{
Sum = Sum + time[j];
}
if(i == People-1)
printf("%d", Sum);
}
여러모로 어디서나 정렬을 자주 사용하게 되는 것 같다. 블로그에 정리하고 있던 정렬 알고리즘을 복습 및 내용을 추가해야겠다.
[2022-02-16 : 정렬 알고리즘 학습 및 정리 예정]
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int People = 0;
int time[1000] = { 0, };
int swap = 0;
int Sum = 0;
scanf("%d", &People);
for (int i = 0; i < People; i++)
{
scanf("%d", &time[i]);
}
//------------정렬해주는 부분------------
for (int j = 0; j < People; j++)
{
for (int i = 0; i < People-1; i++)
{
if (time[i] > time[i + 1])
{
swap = time[i];
time[i] = time[i + 1];
time[i + 1] = swap;
}
}
}
//----------앞으로 나아가며 합산---------
for (int i = 0; i < People; i++)
{
for (int j = 0; j <= i; j++)
{
Sum = Sum + time[j];
}
if(i == People-1)
printf("%d", Sum);
}
}