마트 계산대, 줄을 하나로 서면 왜 더 빠를까
가장 짧은 줄을 골라 섰는데 옆줄이 먼저 줄어든 적이 있나요? 줄은 짧을수록 빨리 빠질 것 같지만, 그건 운이 나빴던 것만이 아닐 수 있습니다. 그런데 계산대와 손님이 모두 똑같은 두 가게에서 한쪽은 줄을 하나로 세우고 다른 쪽은 계산대마다 따로 세우면, 같은 손님이 두 곳에서 전혀 다른 시간을 기다리게 됩니다. 왼쪽 가게와 오른쪽 가게에 똑같은 손님을 보내 보세요.
모델은 이렇게 움직입니다
- 왼쪽 가게(A)는 줄이 하나입니다. 맨 앞 손님은 가장 먼저 빈 계산대로 갑니다. 오른쪽 가게는 계산대마다 줄이 따로 있고, 도착한 손님이 한 번 줄을 고르면 바꾸지 않습니다. 고르는 방식은 B(사람 수가 가장 적은 줄), C(아무 줄이나), D(물건이 가장 적은 줄) 중에서 고릅니다.
- 손님은 무작위로 도착하고(평균 간격은 붐빔 정도로 정해짐), 계산 시간은 평균 3분에 물건 수에 비례합니다. 두 가게에는 똑같은 손님 목록(도착 시각, 물건 수)이 들어가므로, 차이는 오직 줄 서는 방식에서 나옵니다.
- 화면의 점 하나가 손님, 점 크기가 물건 수입니다. 계산대가 놀고 있는데 다른 줄에는 손님이 기다리는 순간은 계산대가 빨갛게 표시됩니다. 금빛 고리가 '나'이고, 점을 누르면 다른 손님이 '나'가 됩니다.
- 결과 숫자는 손님 15만 명을 돌린 긴 시간 평균이고, 화면 속 가게는 문을 연 지 2시간 뒤부터 2시간 동안의 한 장면입니다.
직접 돌려보기
① 두 가게를 나란히 보기
위쪽 계산대, 아래쪽 줄입니다. 파란 왼쪽은 줄 하나, 오른쪽은 계산대마다 줄 하나입니다. 같은 손님이 같은 시각에 도착합니다. 금빛 고리의 '나'는 두 가게 모두에 있고, 아래 문장에서 내 기다림을 비교합니다.
② 붐비는 정도에 따른 평균 대기
가로는 계산대가 바쁜 정도, 세로는 평균 대기시간입니다. 실선은 시뮬레이션, 점선은 계산식으로 구한 값(이론)입니다. 무작위로 줄을 서면(빨강) 붐빌수록 그래프 밖으로 치솟고, 짧은 줄(주황)이나 물건 적은 줄(초록)은 한 줄(파랑)에 훨씬 가깝습니다.
③ 90% 손님이 기다리는 시간
손님 10명 중 9명이 이 시간 안에 계산을 시작합니다. 평균보다 '운이 나쁜 손님'이 얼마나 오래 기다리는지를 보여 줍니다.
④ 기다림의 분포
파란 막대는 한 줄, 선은 오른쪽 가게의 방식입니다. 바로 계산하는 손님은 얼마나 되는지, 오래 기다리는 손님은 얼마나 되는지 비교해 보세요.
이 결과가 말하는 것, 말하지 않는 것
말하는 것:
- 줄을 하나로 서면 대체로 더 빠르고, 계산대가 한가할 때 차이가 크지만 아주 붐비면 차이가 줄어요. 이 모델에선 붐빔 60%에서 1.61배, 95%에서 1.06배였어요.
- 한 줄은 빈 계산대부터 손님을 받아 노는 계산대가 없고, 줄을 나누면 옆이 놀아도 내 줄은 못 옮겨요. 붐빔 90%, 계산대 4개에서 한 줄은 평균 6.1분, 아무 줄이나 서면 29.9분이었어요.
- 그렇다면 어떻게 서야 빠를까? 이 모델에선 줄 하나가 가장 빨랐어요(6.1분). 줄이 나뉘어 있으면 물건 적은 줄(6.5분)이나 사람 적은 줄(6.9분)을 고르는 게 아무 줄(29.9분)보다 훨씬 나았어요.
상세 설명
말하는 것: 계산대 4개, 붐빔 90%, 계산 시간 보통(들쭉날쭉함 1.0)에서 손님 10만 명을 5번 돌린 평균은 이렇습니다. 한 줄은 평균 6.1분, 90% 손님이 16.0분 안에 계산을 시작했습니다. 사람이 가장 적은 줄을 고르는 방식(B)은 평균 6.9분(한 줄의 1.13배), 90%는 18.3분이었고 손님의 44%가 뒤에 온 사람에게 추월당했습니다. 같은 손님을 한 줄과 비교하면 34%는 1분 넘게 더 기다리고 26%는 1분 넘게 덜 기다렸습니다. 아무 줄이나 서는 방식(C)은 평균 29.9분(4.9배)이었고, 물건이 가장 적은 줄을 고르는 방식(D)은 평균 6.5분(1.06배)이었습니다. 계산대가 놀고 있는데 다른 줄에 손님이 있는 시간은 B 11%, C 35%, D 5%였고, 한 줄은 0%입니다. 한 줄이 더 빠른 정도는 설정에 따라 달랐습니다. 덜 붐빌 때 상대적으로 더 컸고(붐빔 60%: B가 1.61배), 계산대가 많을수록 컸으며(2대 1.05배, 8대 1.28배), 계산 시간이 들쭉날쭉할수록 컸습니다(1.5에서 1.18배). 붐빔 95%에서는 1.06배로 줄었는데, 그때는 어느 방식이든 모두 크게 기다리기 때문입니다.
말하지 않는 것:
- 줄을 하나로 하면 늘 이득이라는 뜻은 아니에요. 이 모델에는 줄 바꾸기, 전용 계산대, 셀프 계산대, 줄이 길어 보여 포기하는 손님이 없어요.
- 실제 가게에서 확인하려면 손님이 기다린 시간과 계산대가 비는 순간을 재서 비교해 봐야 해요.
상세 설명
말하지 않는 것: 실제 마트를 재현한 것이 아닙니다. 이 모델에서 손님은 한 번 줄을 고르면 바꾸지 않습니다(옆줄로 옮기는 행동은 넣지 않았으므로, 현실의 줄 바꾸기는 줄 따로의 불리함을 일부 줄여 줄 것입니다). 현실의 계산대에는 물건 적은 손님 전용 계산대, 셀프 계산대, 계산대가 닫히거나 열리는 일, 가격표를 확인하러 가는 일, 줄이 짧아 보이는 착시와 습관이 있지만 모두 넣지 않았습니다. 도착은 하루 내내 같은 속도의 무작위이고 계산 시간 분포는 이 프로젝트가 가정한 것으로 한국 마트의 실제 자료가 아닙니다. 따라서 '줄을 하나로 세우면 반드시 이득'이라는 뜻이 아니라, 이런 단순한 조건에서 줄을 합치는 것이 어떤 효과를 내는지 보여 주는 것입니다. 한 줄이 손님에게 늘 더 낫다고는 할 수 없으며(공간, 줄이 길어 보여 포기하는 손님 등) 매장이 줄 구조를 고르는 데는 이 모델에 없는 요인이 많습니다.
이론적 근거와 구현 메모
- 모델의 뿌리: 대기행렬 이론입니다. 덴마크의 A. K. Erlang이 전화 교환기에서 통화를 기다리는 문제를 풀며 만든 계산식(얼랑 C)이 계산대 여러 개에 한 줄로 서는 가게(M/M/c)의 기본 이론이고, 줄 따로는 계산대마다 따로 계산하는 줄(M/M/1)이 여러 개 있는 경우와 같습니다.
- 핵심 가정과 수식: 붐빔 ρ = 도착률 × 평균 계산 시간 ÷ 계산대 수 (슬라이더 '붐비는 정도'). 계산대 c개, a = ρc일 때 손님이 도착해 기다려야 할 확률 C(c, a)를 얼랑 C 식으로 구하고, 평균 대기는
Wq = C(c, a) × S / (c(1−ρ))(S는 평균 계산 시간 3분), 기다림이 t를 넘을 확률은C × e−c(1−ρ)t/S입니다. 줄 따로이고 아무 줄이나 서면 계산대마다 M/M/1이 되어Wq = ρS / (1−ρ)입니다. - 이 프로젝트의 단순화: 계산 시간을 평균 3분의 감마분포(슬라이더로 들쭉날쭉함 조절)로, 물건 수는 평균 10개로 두고 계산 시간에 비례하게 정한 것은 이 프로젝트의 설정입니다. 들쭉날쭉함이 1.0이 아닐 때의 한 줄 이론선은 평균 대기에 (1+cv²)/2를 곱하는 흔한 근사이고, 무작위 줄은 폴라체크-힌친 평균 대기 공식입니다. 줄 바꾸기, 포기하는 손님, 전용 계산대는 넣지 않았습니다.
- 이론값과 시뮬레이션:
node tools/validate-checkout.js의 결과(시드 5개 × 손님 10만 명 평균, 들쭉날쭉함 1.0)입니다. 계산대 4개 붐빔 60%에서 한 줄 평균 대기는 시뮬레이션 0.54분, 이론 0.54분이고, 붐빔 80%는 2.25분 대 2.24분, 90%는 6.11분 대 5.91분이었습니다. 90% 손님 기준은 붐빔 90%에서 16.0분 대 15.5분입니다. 계산대 2개 붐빔 70%는 2.88분 대 2.88분이었습니다. 무작위 줄은 붐빔 60%에서 4.55분 대 4.50분, 80%에서 12.46분 대 12.00분, 90%에서 29.9분 대 27.0분으로 붐빌수록 시뮬레이션이 이론보다 높게 나왔습니다(유한한 손님 수 때문으로 보임). 들쭉날쭉함 1.5, 붐빔 90%에서 한 줄 근사는 9.60분으로 시뮬레이션 9.03분보다 약 7% 높았습니다. - 더 읽을거리: Leonard Kleinrock, 『Queueing Systems, Volume 1: Theory』(Wiley, 1975). Donald Gross와 Carl M. Harris, 『Fundamentals of Queueing Theory』(Wiley). 줄을 합치는 것이 항상 이로운 것은 아니라는 점은 Rothkopf & Rech (1987), "Perspectives on queues: combining queues is not always beneficial", Operations Research에서 다룹니다.
- 시뮬레이션은 손님 목록(도착 시각, 계산 시간, 물건 수, 무작위 줄 선택용 난수)을 한 번 만들어 모든 방식에 똑같이 넣는 공통 난수 방식입니다. 시드 난수(mulberry32)를 쓰므로 같은 시드면 같은 결과가 나옵니다. 화면의 가게는 두 방식의 시작·끝 시각을 미리 계산해 두고 시간에 따라 위치만 그립니다.
- 추월당한 손님은 자기보다 늦게 도착한 사람이 더 먼저 계산을 시작한 손님입니다. 계산대가 놀면서 기다리는 사람이 있는 시간 비율은 시작과 끝 시각을 시간순으로 훑어 구했고, 처음 10% 손님은 가게가 비어 있던 시기라 통계에서 뺐습니다.
- 카드 숫자는 손님 15만 명을 한 번 돌린 값이라 페이지 설명(10만 명 × 5번 평균)과 조금 다를 수 있습니다. 검증은
node tools/validate-checkout.js로 할 수 있습니다.