웨이팅 시간 계산, 앞 팀 수를 입장 속도로 나눈다

맛집 웨이팅 줄 끝에 서면 앞에 선 팀은 셀 수 있지만, 몇 분을 기다릴지는 보이지 않는다. 앞에 선 팀 수를 입장 속도, 곧 최근에 문으로 들어간 팀의 속도로 나누면 기다릴 시간을 어림할 수 있다(줄에 서서 10분 동안 4팀이 들어가고 앞에 20팀이 남았다면 약 50분 더). 줄에 섰던 팀들의 하루 평균으로 보면 같은 꼴의 나눗셈이 어림이 아니라 정확히 맞는다. 줄에 선 평균 팀 수가 새로 오는 팀이 줄에 붙는 속도와 평균 대기 시간의 곱과 같다는 이 관계를 리틀의 법칙(Little’s law)이라고 한다.

크림색 카드. 왼쪽 위에 굵은 제목 두 줄 「웨이팅 시간 계산, / 앞 팀 수를 입장 속도로 나눈다」가 있고 「앞 팀 수」와 「입장 속도」만 주황색이다. 그 아래 회색 부제는 「셀 것은 둘 — 앞에 선 팀, 문으로 들어간 팀」이다. 오른쪽 위에는 박공 지붕선 아래 식당 정면이 있다. 글자 없이 숟가락과 포크 아이콘만 있는 간판, 창 두 개, 정면 왼쪽 끝의 열린 문이 보이고, 그 문틀 안에 맨 앞 팀이 서 있다. 거기서 왼쪽 아래로 이어지는 대각선 점선을 따라 같은 크기의 사람 묶음 아이콘이 같은 간격으로 늘어서, 문 안의 팀까지 모두 8팀이다. 줄 끝에서 조금 떨어진 왼쪽 아래에는 혼자 선 사람 하나가 있다. 줄 아래쪽에는 줄을 따라 얇은 회색 괄호와 회색 알약 「앞에 선 팀」이 붙어 있다. 문 아래 오른쪽에는 타이머 아이콘과 주황색 세로 눈금 세 줄이 든 작은 흰 카드가 있고, 그 아래 주황색 알약 「들어간 팀」이 있다

맛집 앞 줄 끝에 서서 앞에 선 팀을 하나씩 세어 본다. 스물네 팀째에서 손가락이 멈추면 남는 물음은 하나, 여기서 몇 분을 서 있어야 하느냐다. 줄 선 팀 수만 보고 웨이팅 시간을 계산할 수 있을까?

답은 나눗셈 한 번이다. 앞에 선 팀 수를 입장 속도, 곧 최근에 문으로 들어간 팀의 속도로 나누면 기다릴 시간을 어림할 수 있다. 줄에 서서 10분 동안 4팀이 들어갔다면 입장 속도는 10분에 4팀, 곧 1분에 0.4팀이다. 그사이 앞은 20팀으로 줄었으니, 20을 0.4로 나눈 약 50분을 더 기다리면 된다. 줄에 선 때부터 치면 약 60분이다. 셀 것은 앞에 선 팀과 문으로 들어간 팀, 둘뿐이다.

앞에 선 팀이 모두 들어가야 내 차례가 온다

먼저 온 순서대로 들어가는 줄이라면, 내 차례는 내 앞의 팀이 전부 문을 지난 다음에 온다. 앞에 24팀이 있으면 그 24팀이 모두 들어가야 하고, 그동안 나는 한 칸씩 앞으로 간다. 팀 수만으로는 몇 분인지가 나오지 않고, 그 팀들이 얼마나 빨리 들어가는지가 있어야 한다. 10분에 4팀이 들어간다면 한 팀이 들어가는 간격은 2분 30초꼴이니, 24팀이 다 들어가려면 60분이 걸린다. 입장 속도가 지금처럼 이어진다면, 기다릴 시간은 남은 팀 수를 입장 속도로 나눈 값이다.

이 나눗셈은 리틀의 법칙에서 나온 것이 아니라, 남은 팀을 세는 데서 나온다. 이 글이 읽은 리틀의 법칙 문헌에는 지금 줄에 선 팀 수로 한 사람의 대기를 셈하는 문장이 없다. 또 이 셈은 한 줄로 서서 먼저 온 순서대로 들어가는 줄에서 성립한다. 계산대마다 줄이 갈라진 곳이라면 내 줄과 옆줄의 빠르기가 따로 논다. 세는 단위도 하나로 정해, 앞에 선 쪽도 들어간 쪽도 사람 수가 아니라 팀 수로 센다.

테이블이 몇 개인지, 한 팀이 얼마나 오래 먹는지는 몰라도 된다. 그 사정은 입장 속도에 이미 들어 있다. 그래서 셈에 필요한 것은 줄 전체를 지켜보는 일이 아니라, 문 앞에서 재는 입장 속도 하나다.

평균에 대해서는 리틀의 법칙이 정확하다

같은 꼴의 나눗셈이 어림이 아니라 정확히 맞는 자리가 있다. 한 사람의 대기가 아니라, 줄에 섰던 팀들의 평균을 물을 때다. 하루 동안 줄에 선 평균 팀 수는, 새로 오는 팀이 줄에 붙는 속도에 한 팀이 줄에서 기다린 평균 시간을 곱한 값과 같다. 이 관계를 리틀의 법칙(Little’s law)이라고 부르고, 기호로 쓰면 한 줄이다.

(1) $$ L = \lambda W $$

식 1에서 L은 줄에 선 평균 팀 수, λ(람다)는 줄에 붙는 속도(원문의 말로는 도착률), W는 한 팀이 머문 평균 시간이다. 원문에서 W는 정해 둔 구역(원문은 「시스템」이라 부른다) 안에 머문 시간 전체를 뜻한다. 이 글은 그 구역을 줄로 잡았으니, W가 곧 줄에서 기다린 시간이 된다. 양변을 λ로 나누면 평균 대기는 평균 줄 길이를 줄에 붙는 속도로 나눈 값이 되고, 앞 절의 나눗셈과 같은 꼴이 나온다. 리틀(John D. C. Little)은 50주년 회고 논문에서 셋 중 둘을 알면 셋째를 금방 셈할 수 있다고 적었다. 그리고 그것이 아마 이 법칙의 가장 흔하고 가장 값진 쓰임일 것이라고 했다.

원문에 나오는 일상의 예는 이 셈을 반대 방향으로 쓴다. 리틀과 그레이브스(Stephen C. Graves)가 쓴 교재 장에는 도넛 가게 예가 있다. 줄이 평균 10명쯤이고 가게에 들어갔다 나오는 데 3분쯤 걸린다면, 손님이 오는 속도는 1분에 10/3명, 시간당 200명이다. 줄 길이와 머문 시간을 보고 세 번째 값인 속도를 낸 셈이다. 원문에는 카페테리아 줄이 예로 한 번 나오지만, 식당 앞 웨이팅 줄을 셈하는 예는 없다.

여기서 두 속도를 갈라 둔다. 리틀의 법칙의 λ는 줄에 붙는 속도인데, 앞 절의 셈은 입장 속도로 나눴다. 리틀과 그레이브스는 운영 현장에서는 이 법칙의 속도를 도착 쪽이 아니라 빠져나가는 쪽에서 잰다고 쓴다. 이 글의 줄로 옮기면 줄에 붙는 쪽이 아니라 입장 쪽, 곧 입장 속도다.

두 사람은 두 속도가 같으려면 들어온 만큼 나가야 한다고 덧붙였다. 도중에 사라지는 일도 없어야 한다. 이것을 줄에 옮기면, 줄 서다 떠나는 팀이 없고 세기 시작할 때와 끝낼 때의 줄 길이가 비슷할 때 줄에 붙는 속도와 입장 속도가 같아진다. 리틀의 2011년 논문에 나오는 슈퍼마켓 예도 하루 동안 계산대를 지난 손님 수로 λ를 셌다.

그렇다고 이 법칙이 줄 끝에 선 한 사람의 대기를 미리 알려 주는 것은 아니다. 1961년 리틀이 처음 낸 증명은 오래 지켜본 평균에 관한 것이었다. 리틀은 2011년 회고에서, 하루 같은 정해진 구간에서 이 등식이 정확하다는 것도 지나고 나서의 일이라고 적는다.

However, let it be noted that the determinism and exactness are after the fact, i.e., the sample path is known. This is not all bad. It just says that we are in the measurement business, not the forecasting business.

다만 값이 하나로 딱 정해지고 정확하다는 것은 사후의 일, 곧 실제로 일어난 경로를 이미 안 뒤의 일이라는 점을 짚어 둔다. 이것이 나쁘기만 한 것은 아니다. 우리가 하는 일이 예보가 아니라 측정이라는 것일 뿐이다.

John D. C. Little, 「Little’s Law as Viewed on Its 50th Anniversary」(2011), p.538

리틀과 그레이브스는 산부인과 병동 예에서도 같은 선을 긋는다. 이 법칙은 평균적으로 필요한 만큼만 알려 주므로, 병동은 붐비는 때를 감당하게 지어야 한다고 적었다. 두 사람이 놀랍다고 적은 것 하나는 이 식에 창구가 몇 개인지가 나오지 않는다는 점이다. 창구 수는 평균끼리의 관계에는 끼지 않지만, 기다림이 얼마나 길어지는지에는 크게 걸린다. 그쪽 셈은 상담원 수를 정하는 문제에서 따로 다룬다. 줄 끝에서 내가 하는 셈은 어림이고, 지난 하루를 두고 낸 평균은 정확하다.

줄 끝에서 무엇을 몇 분 세면 될까

줄 끝에서 할 일은 네 단계다. 세는 것이 둘이고 나누기가 한 번이지만, 무엇을 얼마나 오래 세느냐에 따라 셈이 맞는 정도가 달라진다. 단계마다 셈이 얼마나 맞는지는 뒤에서 가상 식당 시뮬레이션으로 잰다.

  1. 줄에 서자마자 문으로 들어가는 팀을 세기 시작한다. 줄 끝에 새로 붙는 팀이 아니라, 줄에서 빠져 가게로 들어가는 팀이다.
  2. 10분쯤 센 뒤, 그때 내 앞에 남은 팀 수를 센다. 나는 넣지 않는다.
  3. 앞에 남은 팀 수를 (들어간 팀 수 ÷ 센 시간)으로 나눈다. 괄호 안이 입장 속도이고, 답은 그때부터 남은 시간의 어림이다.
  4. 더 서 있게 되면 세기를 이어 가며 다시 나눈다.

계산기의 기본값은 글 첫머리와 다른 예로, 30분을 센 경우다. 30분 동안 12팀이 들어갔고 다 센 그때 앞에 24팀이 남았다면, 24 ÷ (12 ÷ 30) = 60이니 남은 시간은 약 60분이다. 앞에 남은 팀 수에 나를 넣지 않는 것은 그쪽이 1에 더 가깝게 잡히기 때문이다. 나를 빼고 나누면 셈은 대개 실제보다 조금 짧게, 넣으면 꽤 길게 나온다.

크림색 카드. 굵은 제목 「웨이팅 시간 어림 계산기」 아래에 테두리 카드 세 개가 나란히 있다. 사람 아이콘의 회색 이름표 「앞에 선 팀」과 큰 값 「24팀」, 타이머 아이콘의 「센 시간」과 「30분」, 화살표 아이콘의 「그동안 들어간 팀」과 「12팀」이다. 그 아래 회색 이름표 「기다릴 시간」 밑에 결과 「약 60 분」이 크게 있고, 숫자 60만 주황색이다. 그 밑에 셈 한 줄 「24팀 ÷ (12팀 ÷ 30분) = 60분」이 있다. 가로 구분선 아래 회색 문구는 「최근 입장 속도가 그대로 이어진다고 보고 낸 어림 — 실제 대기는 이보다 짧거나 길 수 있다」다. 정지 그림에는 기본값으로 셈한 결과만 보인다
그림 1. 글에서는 그림 아래 세 칸에 숫자를 넣거나 슬라이더를 밀어 기다릴 시간을 다시 어림할 수 있다. 기본값은 30분 동안 12팀이 들어가고 앞에 24팀이 남은 경우다.

그림 1 아래 칸에 줄에서 센 숫자를 넣거나 슬라이더를 밀면 결과가 바로 바뀐다. 칸은 셋으로, 앞에 선 팀과 센 시간, 그동안 들어간 팀이다. 결과 아래 문구대로, 이 값은 최근 입장 속도가 그대로 이어진다고 보고 낸 어림이다. 실제 대기는 이보다 짧을 수도 길 수도 있고, 얼마나 빗나가는지는 뒤의 「한 팀의 대기로 쓰면 어디서 빗나갈까」에서 잰다.

단체 손님도 인원과 상관없이 한 팀으로 센다. 앞에 선 팀과 들어간 팀을 같은 단위로 세기만 하면 된다. 리틀도 슈퍼마켓 예에 단 주석에서, 카트를 세면 손님이 아니라 카트를 세는 것이고 한 카트에 여러 사람이 딸릴 수 있어 「구매 단위」라 부를 수도 있다고 적었다. 식당의 팀도 같은 식으로 보면 된다.

10분 동안 아무도 들어가지 않았다면 셈이 서지 않는다. 그때는 들어가는 팀이 나올 때까지 조금 더 센다. 반대로 앞에 남은 팀이 거의 없으면 셈은 0 근처를 가리키지만, 첫 자리가 날 때까지는 몇 분이 더 걸린다. 문 앞에서 오래 셀수록, 셈이 지나치게 길게 나오는 일이 줄어든다.

같은 넓이를 두 번 세면 평균끼리 맞는다

리틀의 법칙이 손님이 오는 방식의 확률 분포를 몰라도 맞는 까닭은 그래프 한 장에 있다. 가로축에 시간, 세로축에 줄에 선 팀 수를 놓으면, 팀이 줄에 붙을 때 한 칸 오르고 문으로 들어갈 때 한 칸 내려가는 계단이 그려진다. 이 계단 아래 넓이는 두 가지 방법으로 셀 수 있다.

첫째는 시각마다 세로로 자르는 방법이다. 줄에 2팀이 10분 동안 서 있었다면, 그 칸의 넓이는 2 × 10 = 20팀·분이다. 이렇게 시각마다 줄에 선 팀 수에 그 시간을 곱해 모두 더하면 넓이가 되고, 이것을 전체 시간으로 나누면 평균 줄 길이다. 둘째는 팀마다 가로로 자르는 방법이다. 팀 하나는 줄에 붙은 순간부터 들어간 순간까지 높이 1짜리 가로 막대를 차지하니, 막대 길이를 다 더해도 같은 넓이가 나온다. 이 합을 팀 수로 나누면 평균 대기다.

크림색 카드. 굵은 제목 「같은 넓이를 두 번 센다」와 회색 부제 「줄에 선 팀 수의 계단 — 그 아래 넓이를 시각마다 한 번, 팀마다 한 번」이 있다. 위 칸 「팀마다 한 줄에 한 팀 — 줄 선 시각부터 들어간 시각까지」에는 1팀부터 7팀까지의 회색 가로 막대가 한 줄에 하나씩 놓였고, 1팀이 맨 아래다. 아래 방향 화살표와 「막대를 시각마다 잘라 아래로 쌓으면」 뒤로, 가로축 0~20분, 세로축 「줄에 선 팀 수」 0~4인 계단 그래프가 있다. 검은 계단 선은 0에서 시작해 오르내리다 0으로 끝나고, 양 끝에 빈 고리가 있다. 계단 안은 팀 조각이 빈틈없이 채운다. 조각은 주황색 테두리에 연한 주황 면과 흰 면이 팀마다 번갈아 칠해졌고, 넓은 조각에는 팀 번호가 적혀 있다. 아래 칩 ①「시각마다」는 「넓이 32.32팀·분 ÷ 20.11분 = 평균 줄 1.61팀」, 칩 ②「팀마다」는 「팀별 대기를 더해도 32.32팀·분 ÷ 7팀 = 평균 대기 4.62분」이다. 맨 아래 회색 표지는 「장난감 예 — 테이블 1개 · 7팀」이다
그림 2. 테이블 하나짜리 장난감 줄에서 7팀이 20.11분 동안 만든 계단. 팀별 막대를 시각마다 잘라 쌓으면 계단 안을 빈틈없이 채우고, 시각마다 센 넓이와 팀별 대기를 더한 넓이가 같다.

그림 2의 장난감 줄에서는 시각마다 센 넓이와 팀별 대기를 더한 값이 둘 다 32.32팀·분이다. 이것을 20.11분으로 나누면 평균 줄 1.61팀, 7팀으로 나누면 평균 대기 4.62분이다. 1분에 0.348팀이 왔으니, 0.348에 4.62를 곱하면 다시 1.61이다.

같은 넓이가 두 번 나오는 까닭을 리틀은 한 문장으로 적었다. 「An item in queue is also waiting.」 줄에 서 있는 팀은 그 순간 셀 수 있는 팀이면서, 동시에 기다리는 시간을 쌓고 있는 팀이라는 것이다. 그래서 손님이 언제 몰리는지는 셈에 끼지 않는다. 리틀과 그레이브스는 한동안 아무도 오지 않다가 버스 몇 대분 손님이 한꺼번에 와도, 계산대가 전부 한 시간 동안 멈춰도 이 등식이 맞는다고 적었다. 창구 수에 이어 도착 간격과 처리 시간의 분포, 처리 순서도 이 등식에는 필요 없다.

대신 조건이 붙는다. 넓이를 재는 구간의 처음과 끝에 줄이 비어 있고, 줄 서다 떠난 팀이 없어야 한다. 문을 열 때 줄이 0에서 시작해 마지막 팀이 들어가며 다시 0이 되는 하루가 이 조건에 맞는다. 처음이나 끝에 줄이 남아 있으면 구간 밖으로 삐져나간 대기가 한쪽 셈에만 들어가 등식이 깨진다.

이 글의 가상 식당에서 한 저녁을 돌려 확인했다. 문을 연 0분부터 마지막 팀이 들어간 283.8분까지 79팀이 왔고, 시각마다 센 넓이와 79팀의 대기를 더한 값이 똑같이 3639.6팀·분이었다. 그래서 평균 줄 12.82팀은 1분에 0.278팀이라는 줄에 붙는 속도와 평균 대기 46.1분의 곱과 맞는다. 이 평균 대기에는 오자마자 앉아 기다리지 않은 16팀이 0분으로 들어 있다. 넓이가 두 번 같게 나오는 것은 이 저녁만의 일이 아니라 어느 저녁에나 마찬가지다. 분포를 몰라도 되는 까닭은 특별한 계산 요령에 있지 않고, 줄에 선 팀이 동시에 기다리는 팀이라는 데 있다.

한 팀의 대기로 쓰면 어디서 빗나갈까

평균이 정확하다고 해서 한 사람이 겪는 값까지 맞는 것은 아니다. 무작위로 정류장에 간 사람이 긴 버스 간격에 더 자주 걸리듯, 평균과 내가 겪는 값은 다를 수 있다. 그래서 위의 네 단계를 가상 식당의 저녁 2,000번에 그대로 돌렸다. 줄에 선 순간부터 들어간 팀을 세고, 다 센 그때 앞에 남은 팀으로 낸 셈을 그때부터 실제로 기다린 시간으로 나눴다. 1이면 딱 맞고, 1보다 작으면 짧게, 크면 길게 잡은 것이다.

크림색 카드. 굵은 제목 「무엇을 얼마나 세느냐에 따라」 아래 회색 부제 「줄에 서서 센 뒤의 셈 ÷ 그때부터 실제로 기다린 시간」이 있다. 범례는 회색 띠 「열 팀 중 가운데 여덟 팀」, 검은 테의 흰 점 「중앙값」, 옅은 회색 칸 「±20% 안」 셋이다. 줄들 위에 「← 짧게 잡음」, 「딱 맞음」, 「길게 잡음 →」이 적혀 있고, 1배 자리를 세로 점선이 지난다. 세 줄마다 띠 아래에 10분위·중앙값·90분위 숫자가, 오른쪽 위에 ±20% 안 비율이 있다. 「10분 센 뒤 · 들어간 팀」은 0.44 · 0.93 · 2.53에 ±20% 안 24.4%다. 주황색 띠의 「30분 센 뒤 · 들어간 팀」은 0.00 · 0.86 · 1.90에 25.6%이고, 띠 왼쪽 끝이 축 밖으로 열린 화살촉이며 「0.00」 옆에 회색 주석 「앞에 남은 팀이 없으면 셈은 0」이 있다. 「10분 센 뒤 · 새로 온 팀」은 0.37 · 0.84 · 2.44에 20.5%다. 가로 눈금 0.3배·0.5배·1배·2배·3배는 배율 간격으로 놓였다. 맨 아래 회색 표지는 「가상 식당 저녁 2,000번 · 30분 뒤에도 줄에 있던 팀만」이다
그림 3. 이 가상 식당(테이블 12 · 식사 평균 45분)의 저녁 2,000번에서, 30분 뒤에도 줄에 있던 같은 팀을 10분 센 뒤와 30분 센 뒤에 셈했다. 띠는 열 팀 중 가운데 여덟 팀이 놓인 범위, 점은 중앙값이다. 30분 센 뒤 띠의 왼쪽 끝 0은 앞에 남은 팀이 없어 셈이 0이 된 경우로, 30분 뒤에도 줄에 있던 팀 전체로 보면 14.4%가 그때 첫 빈 테이블을 기다리고 있었다.

그림 3는 30분 뒤에도 줄에 있던 같은 팀을 10분 센 뒤와 30분 센 뒤에 한 번씩 셈한 결과다. 애초에 30분 뒤까지 줄에 남는 팀은 앞에 줄이 있던 팀의 45.3%로, 절반이 안 된다. 10분 센 뒤에는 중앙값이 0.93으로 1에 가깝지만, 열 팀 중 여덟 팀이 0.44배에서 2.53배 사이로 퍼진다. 테이블 12개를 평균 45분씩 쓰는 설정에서는 테이블이 다 찬 동안 10분에 평균 2.67팀만 들어가, 한 팀 차이로도 셈이 크게 튀기 때문이다.

30분까지 세면 실제보다 훨씬 길게 잡는 경우가 준다. 가운데 여덟 팀이 놓인 범위의 오른쪽 끝이 2.53배에서 1.90배로 당겨졌다. 다만 ±20% 안에 든 팀은 24.4%에서 25.6%로 거의 그대로였다.

셋째 줄은 들어간 팀 대신 줄 끝에 새로 붙은 팀을 10분 센 경우로, 같은 팀인데도 중앙값이 0.84로 내려가 대기를 짧게 잡는다. 시간대로 나누면 방향이 갈린다. 10분 센 뒤의 셈으로 보면, 손님이 몰리는 60~150분에 온 팀은 중앙값 0.60으로 짧게, 잦아드는 150분 뒤에 온 팀은 1.22로 길게 잡았다. 이 두 구간은 줄 길이가 변해 두 속도가 같아지는 조건이 깨진 곳이라, 새로 온 팀을 세면 줄이 자랄 땐 짧게, 줄어들 땐 길게 잡는다.

들어간 팀을 세면 이런 갈림이 없다. 몰릴 때 온 팀도 중앙값 0.89, 잦아들 때 온 팀도 0.91로 둘 다 0.9 근처였다. 줄이 있는 동안 입장 속도는 손님이 얼마나 몰리느냐보다 테이블 수와 식사 시간이 정하기 때문이다. 세는 순서의 첫 단계를 들어간 팀으로 잡은 까닭이 여기에 있다.

줄에 설 때 앞 팀이 적었으면 셈은 실제보다 한참 짧게 나온다. 앞에 1~4팀이었던 팀은 중앙값 0.58에, ±20% 안에 든 팀이 10.4%뿐이었다. 5팀 이상이었으면 중앙값이 0.90~0.95, ±20% 안이 21.6~25.1%였다. 들어간 팀을 세면 셈을 실제 대기로 나눈 값은 중앙값이 1보다 조금 아래지만, 팀 하나하나의 값은 그 둘레로 꽤 넓게 흩어진다.

다시 줄 끝에서

앞에 스물네 팀을 둔 그 사람에게 남은 일은 고개를 문 쪽으로 돌리는 것이다. 줄 끝에 새로 붙는 팀은 두고, 문으로 들어가는 팀을 10분쯤 센다. 그사이 네 팀이 들어가 앞이 스무 팀으로 줄었다면, 나눌 것은 처음 센 스물네 팀이 아니라 그 스무 팀이다. 스무 팀을 1분에 0.4팀으로 나누면 50분쯤 남았다는 어림이 나온다. 예보는 아니지만, 놀이공원 줄처럼 한 줄로 서서 먼저 온 순서대로 들어가고 들어가는 모습이 보이는 줄이라면 해 볼 수 있는 어림이다. 들어가는 팀을 세면, 줄 끝에서 기다릴 시간을 어림할 수 있다.

더 읽기