less than 1 minute read

1701. Average Waiting Time / c++ / Medium / 30분

문제 및 코드

문제 링크

class Solution {
public:
    double averageWaitingTime(vector<vector<int>>& customers) {
        long long currentTime = 0;
        long long waitTimeSum = 0;

        for (const auto& iter : customers)
        {
            if (currentTime < iter[0])
            {
                currentTime = iter[0];
            }

            currentTime += iter[1];
            waitTimeSum += currentTime - iter[0];
        }

        return waitTimeSum / (double)customers.size();
    }
};

접근 방식

자료 구조 / 배열

  1. 모든 손님에게 차례대로 음식을 준비한다 했을 때, 손님들의 대기 시간의 평균값을 구하는 문제
  2. customers 벡터를 순회면서
    1. 만약 현재 시간이 손님의 도착 시간보다 작다면 갱신
    2. 현재 시간에 해당 손님의 음식 준비 시간을 더한다
    3. waitTimeSum에 손님의 대기 시간 (현재 시간 - 손님의 도착 시간)을 더한다
  3. waitTimeSum을 손님의 수로 나눠 준다. 이 때 double로 반환해야 하므로 손님의 수에 double을 취해준다.
  4. 해결

생각해 볼 점

  1. 차례대로라는 문제의 설명을 제대로 못읽고, 당연하게 대기 시간의 최소 값 인줄 알고, 그리디 알고리즘을 써서 항상 처리할 수 있는 손님 중 가장 준비 시간이 작은 손님을 처리했더니 틀렸었다..
  2. 손님의 수는 100’000, 손님 당 준비 시간은 10’000 이므로, 이를 곱하면 10’000’000’000 (백억) 이 나오는데, 이걸 십억으로 착각하고, currentTime과 waitTimeSum의 자료 형을 int로 선언했더니, overflow가 났었다.. 값의 최대 범위 체크에 좀 더 신경써야겠다.