옆줄이 더 빠른 이유 — 줄이 3개면 내 줄이 1등일 확률은 1/3이다

한 줄 서기는 계산대마다 갈라진 줄을 하나로 합쳐, 맨 앞 손님을 그때그때 비는 계산대로 보내는 방식이다. 줄이 3개로 갈려 있으면 내 줄이 가장 빠를 확률은 1/3뿐이라, 옆줄이 먼저 빠지는 건 정상이다. 손님이 무작위로 줄을 고를 때 한 줄 서기는 계산대 3개 기준 평균 대기를 약 3배 줄인다. 손님이 짧은 줄을 골라 서면 그 차이는 붐비는 시간대에 7~18%로 좁아지고, 대신 나중에 온 사람이 먼저 나가는 일이 없어진다.

계산대 앞에서

왼쪽은 쿠폰 손님 때문에 가운데 줄이 멈춘 마트 계산대 세 줄, 오른쪽은 한 줄로 서서 빈 창구로 가는 은행 장면

마트 계산대가 셋 열려 있다. 눈으로 대충 재 보고 가장 짧아 보이는 줄 뒤에 선다. 그런데 몇 분 뒤, 내 뒤에 와서 옆줄에 선 사람이 계산을 끝내고 먼저 나간다. 내 앞 손님은 쿠폰 뭉치를 꺼내 한 장씩 확인받는 중이다.

이런 일을 자주 겪는다면 줄을 고르는 눈이 나쁜 걸까. 그렇지는 않다. 줄을 아무리 잘 골라도 옆줄이 이기는 일은 계속 생기고, 그 빈도는 계산으로 미리 나온다. 줄을 세 개로 갈라 놓은 순간부터 내가 이길 확률은 정해져 있기 때문이다.

물론 기억도 한몫한다. 줄이 잘 빠질 때는 옆줄을 쳐다볼 일이 없고, 내 줄이 막힐 때만 고개를 돌려 옆줄을 본다. 그래서 옆줄이 이기는 장면만 남는다. 다만 기억은 원래 있던 격차를 더 크게 느끼게 할 뿐이고, 격차 자체는 기억과 상관없이 남는다.

그 격차를 셋으로 나눠 확인해 보자. 먼저 내 줄이 1등일 확률을 세고, 다음으로 줄마다 속도가 갈리는 이유를 보고, 마지막으로 그 억울함을 실제로 없애는 방법까지 간다.

내 줄이 1등일 확률은 1/3이다

줄이 $n$개 있고 내가 그중 하나에 섰다고 하자. 각 줄의 진행 속도는 그 줄에 선 손님들이 정한다. 누가 쿠폰을 꺼낼지, 누구 카드가 한 번에 안 읽힐지는 줄에 서기 전에는 알 수 없다. 그러니 어느 줄이 가장 빨리 끝날지도 서기 전에는 알 수 없고, 줄들은 서로 대등한 처지가 된다.

대등하다면 답은 바로 나온다. 내 줄이 가장 빨리 끝날 확률을 $P$라고 하면, 줄 하나하나가 1등을 할 자격이 똑같으니 그 확률은 줄 수로 나눈 값이다.

(1) $$ P = \frac{1}{n} $$

줄이 3개면 1/3이다. 나머지 2/3, 그러니까 셋 중 두 번은 옆줄 중 적어도 하나가 나보다 빠르게 끝난다. 억울함의 기본값이 이미 2/3이라는 뜻이다.

그림 1은 줄 수를 바꿔 가며 이 값을 직접 세어 본 결과다. 줄마다 내 앞에 손님 4명이 있다고 두고, 손님별 계산 시간을 무작위로 뽑아 줄별 합을 비교했다. 20만 번을 돌려 얻은 값은 줄 2개에서 0.498, 3개에서 0.333, 5개에서 0.202다. 식 1의 1/n과 소수점 둘째 자리까지 같다.

줄 수 2·3·5에서 내 줄이 1등일 확률을 막대로 그리고 1/n 참조선을 얹은 그래프
그림 1. 줄 수가 늘수록 내 줄이 1등일 확률은 1/n으로 정확히 떨어진다

같은 실험은 파이썬 코드 열 줄이면 노트북에서 몇 초 만에 끝난다. 줄 수를 2·3·5로 바꿔 가며 내가 선 줄이 1등한 비율을 세어 보자.

import numpy as np

rng = np.random.default_rng(1)
trials, ahead = 100_000, 4          # 줄마다 내 앞에 4명, 10만 번 반복

for n in (2, 3, 5):
    # 줄 n개 × 앞사람 4명의 계산 시간(평균 1인 지수분포)
    t = rng.exponential(1.0, size=(trials, n, ahead)).sum(axis=2)
    first = (t.argmin(axis=1) == 0).mean()   # 0번 줄 = 내가 선 줄
    print(f"n={n}  내 줄이 1등일 확률 {first:.3f}   (1/n = {1/n:.3f})")
n=2  내 줄이 1등일 확률 0.504   (1/n = 0.500)
n=3  내 줄이 1등일 확률 0.332   (1/n = 0.333)
n=5  내 줄이 1등일 확률 0.201   (1/n = 0.200)

세 줄 모두 1/n 값과 소수점 둘째 자리까지 붙는다. 계산 시간을 뽑는 분포를 바꿔도 결과는 그대로다. 대부분 비슷한 시간이 걸리는 균등분포로 바꿔도, 가끔 아주 오래 걸리는 손님이 섞이는 로그정규분포로 바꿔도 1/n이 나온다. 줄이 대등하기만 하면 분포 모양은 답에 끼어들지 못한다. 그러니 이 2/3를 줄이는 방법도 줄 고르는 요령 바깥에 있을 수밖에 없다.

한 줄 서기가 이기는 이유

은행과 공항 출국장은 줄을 계산대마다 나누지 않는다. 손님을 뱀처럼 한 줄로 세워 두고, 창구가 비는 순서대로 맨 앞 사람을 보낸다. 대기행렬 이론에서는 이 방식을 풀링(pooling)이라고 부른다.

한 줄로 합치면 달라지는 것이 하나 있다. 쿠폰 손님이 창구 하나를 붙잡고 있어도, 그 뒤에 갇히는 사람이 없다. 뒤에 선 사람들은 다른 창구가 비는 대로 빠져나간다. 손님 한 명이 오래 걸리는 사건이 그 손님 한 명의 지연으로 끝나고, 줄 전체의 지연으로 번지지 않는다.

이 차이가 얼마나 되는지는 교과서 계산으로 나온다. 계산대 3개, 계산대가 바쁜 시간의 비율을 뜻하는 이용률 $\rho$가 0.9인 상황을 보자. 손님이 무작위로 줄을 고르는 구조에서 평균 대기는 손님 한 명 계산 시간의 9.0배이고, 같은 손님을 한 줄로 합치면 2.7배다. 손님이 무작위로 줄을 고를 때 한 줄 서기가 대기를 3.3배 줄인다는 뜻이다. 붐빌수록, 즉 이용률이 1에 가까워질수록 이 배수는 계산대 개수인 3 쪽으로 다가간다.

"For a checkout with three cashiers, this system makes things about three times faster, Prof. Hammack says."

The Globe and Mail, Dakshana Bascaramurty, 2010-12-30

기사에 인용된 3배는 손님이 줄을 무작위로 고를 때의 값이다. 그런데 마트에서 사람들은 무작위로 서지 않는다. 다들 짧은 줄을 눈으로 찾아 선다. 손님이 짧은 줄을 골라 서는 상황을 그대로 시뮬레이션해 보면, 붐비는 시간대에 한 줄 서기가 짧은 줄 고르기보다 평균 대기를 더 줄이는 몫은 7~18%에 그친다. 무작위로 고를 때의 3배와는 거리가 멀다.

그럼 한 줄 서기가 지키는 것은 무엇인가. 순서다. 짧은 줄을 골라 서는 방식에서는 나보다 늦게 온 사람이 나보다 먼저 계산을 시작하는 일이 셋 중 한 번꼴(0.28~0.39)로 일어나는데, 한 줄 서기에서는 그 확률이 0이다. 줄이 하나면 도착한 순서가 그대로 계산 순서이기 때문이다. 옆줄이 더 빠르다는 체감의 정체가 바로 이 사건이다.

줄이 갈리는 진짜 이유 — 계산시간의 편차

줄이 갈리는 이유를 한 겹 더 들어가 보자. 손님마다 계산 시간이 다르다는 것, 그 다름의 폭이 문제다. 모든 손님이 정확히 같은 시간을 쓴다면 줄 셋은 나란히 줄어들고 억울할 일도 없다. 실제로는 물 한 병만 사는 손님과 장바구니를 가득 채운 손님이 같은 줄에 섞인다.

그림 2는 계산대 3개에 손님이 흘러 들어가는 한 구간을 줄별 가로 띠로 그린 것이다. 손님 한 명이 블록 하나이고, 블록의 길이가 그 손님의 계산 시간이다. 유난히 긴 블록 하나가 보이면 그 뒤로 같은 줄의 블록들이 통째로 밀린다. 옆줄에서는 그 사이에 서너 명이 빠져나간다.

계산대 3줄의 손님 계산 시간을 가로 띠 블록으로 그린 그림. 한 줄에 유난히 긴 블록이 있고 그 뒤가 밀려 있다
그림 2. 긴 손님 한 명이 그 줄 전체를 세운다

여기서 중요한 것은, 대기를 정하는 쪽이 평균 계산 시간이 아니라는 점이다. 대기를 정하는 것은 계산 시간이 얼마나 들쭉날쭉한가, 즉 편차다. 평균이 똑같아도 편차가 커지면 평균 대기도 길어진다.

한 줄로 합친 계산대의 평균 대기는 폴라첵–힌친 공식 $W_q = \frac{\rho}{1-\rho}\cdot E[S]\cdot\frac{1+CV^2}{2}$로 나온다. 여기서 $E[S]$는 평균 계산 시간이고, $CV$는 변동계수, 즉 계산 시간의 표준편차를 평균으로 나눈 값이다. 편차가 없으면 0이고, 손님마다 들쭉날쭉할수록 커진다. 계산해 보면 $\rho=0.8$일 때 평균 대기는 $CV^2$이 0이면 계산 시간의 2.0배, 1이면 4.0배, 4면 10.0배다. $CV^2$이 1 커질 때마다 평균 대기는 계산 시간의 2배씩 늘어난다.

실제 손님은 이 편차를 눈으로 피해 보려 한다. 가장 짧아 보이는 줄을 고르는 행동이 바로 그 시도다.

3배가 깨지는 지점 — 짧은 줄을 고르면

손님이 무작위로 줄을 고를 때의 3배가 실제 마트에서 어디까지 남는지 보자. 사람이 실제로 하는 행동을 시뮬레이션에 넣으면 된다. 도착한 손님이 세 줄을 보고 대기 인원이 가장 적은 줄에 선다. 이 규칙으로 손님 12만 명을 흘려 보내고, 이용률 $\rho$를 0.5에서 0.95까지 올려 가며 평균 대기를 재면 그림 3가 나온다.

이용률에 따른 평균 대기 곡선 세 개. 무작위 줄 고르기가 가장 높고 짧은 줄 고르기와 한 줄 서기는 거의 붙어 있다
그림 3. ρ=0.9에서 무작위 8.8 · 짧은 줄 3.0 · 한 줄 2.8

세 곡선 중 무작위로 서는 곡선만 저 위에 따로 논다. 짧은 줄 고르기와 한 줄 서기는 거의 붙어 있어서, 붐비는 구간에서는 둘 사이 간격을 눈으로 재기도 어렵다. 한가할 때는 그래도 차이가 보인다. 이용률 0.5에서 짧은 줄 고르기의 평균 대기는 한 줄 서기의 1.6배다. 그런데 붐빌수록 둘은 가까워져서 0.8에서 16%, 0.9에서 8%, 0.95에서는 3% 차이까지 좁혀진다. 줄이 길어지면 어느 줄이 짧은지 보고 서는 일이 별 소용이 없어지기 때문이다.

평균이 붙는 대신 벌어지는 것이 있다. 추월당할 확률이다.

짧은 줄을 골라 서는 방식에서 이 확률은 이용률 0.5에서 0.087, 0.9에서 0.391, 0.95에서 0.475까지 올라간다. 붐빌수록 두 명 중 한 명꼴로 겪는다는 뜻이다. 한 줄 서기에서는 어느 이용률에서도 0이다. 가장 오래 기다린 손님들을 뜻하는 95분위 대기도 한 줄 쪽이 9~16% 짧다.

이 시뮬레이션에 없는 행동이 하나 있다. 서 있던 줄이 막혔을 때 옆줄로 옮겨 타는 것이다. 실제 손님은 그렇게 하고, 그렇게 하면 짧은 줄 고르기는 한 줄 서기 쪽으로 조금 더 다가간다. 방향만 분명하고 크기는 재지 않았다.

다시 계산대 세 줄 앞

내일 또 계산대 세 줄 앞에 선다. 이번에도 가장 짧아 보이는 줄이 어디인지 눈으로 재게 된다. 그 눈대중은 여전히 쓸모가 있어서, 무작위로 아무 줄에나 서는 것보다는 평균 대기가 확실히 짧아진다. 다만 줄 고르기가 벌어 주는 몫은 거기서 멈춘다. 붐비는 시간대에 한 줄 서기와 벌어지는 7~18%의 평균 격차는 어느 줄에 서도 남고, 뒤에 온 사람이 먼저 나가는 일도 셋 중 한 번은 그대로 남는다.

그러니 내 앞 손님이 쿠폰을 꺼내도 줄을 잘못 골랐다고 생각할 일은 아니다. 셋 중 두 번은 옆줄이 더 빠른 게 원래 값이다. 이 억울함을 실제로 없앨 수 있는 쪽은 손님이 아니라 가게다. 줄을 계산대 수만큼 갈라 놓는 대신 하나로 합치고, 비는 계산대로 맨 앞 사람을 보내면 된다. 은행과 공항이 이미 그렇게 하고 있다. 마트 계산대만 아직 줄을 갈라 놓고 있을 뿐이다.

더 읽기

  • Dakshana Bascaramurty, "Stuck in the slow line? Here’s why", The Globe and Mail, 2010-12-30 — Bill Hammack 교수의 한 줄 서기 설명이 실린 기사.
  • Leonard Kleinrock, Queueing Systems, Volume 1: Theory, Wiley, 1975 — M/M/1·M/M/c·폴라첵–힌친 공식의 교과서 정본.
  • Bill Hammack, EngineerGuy 영상 목록 — 같은 저자의 공학 해설 영상.
  • 관련 글: 줄 합치기의 함정 — 손님이 줄을 보고 고를 때 이 결론이 뒤집히는 구간.