누가 얼마 누구에게 줘야 할까: 정산 계산법
다섯 명, 열일곱 건의 지출, 결제한 사람은 네 명. 질문은 언제나 하나이고, 답도 하나뿐입니다. 누가 얼마를 누구에게 보내야 할까요.
읽는 데 10분
다섯 명이서 주말여행을 다녀왔습니다. 누군가는 숙소비를 냈고, 누군가는 장을 봤고, 또 다른 누군가는 기름값과 통행료를 냈고, 두 명은 한 푼도 내지 않았습니다. 단체 채팅방에서는 "자, 그럼"으로 대화가 시작되지만 끝까지 정리되는 경우는 드뭅니다.
계산 자체는 간단합니다. 어려운 건 이걸 순서에 맞게, 질문을 헷갈리지 않고 말로 풀어내는 일입니다.
중요한 건 이 공식 하나뿐
각 사람마다 다음을 계산합니다.
잔액 = 이 사람이 낸 돈 − 이 사람이 부담해야 할 돈 + 이 사람이 다른 사람에게 갚은 돈 − 이 사람이 받은 돈
잔액이 양수면 돈을 받아야 한다는 뜻입니다. 음수면 돈을 내야 한다는 뜻입니다.
그리고 매번 검증할 가치가 있는 성질이 하나 있습니다.
모임 전체 잔액의 합은 항상 정확히 0입니다.
이건 그냥 좋은 말이 아니라 하나의 검증 방법입니다. 누군가 낸 돈은 그 사람 자신을 포함해 누군가의 부담이 됩니다. 잔액의 합이 0이 되지 않는다면 지출을 빠뜨렸거나, 참가자를 빠뜨렸거나, 상환 내역을 반대로 계산한 것입니다. 나머지를 논의하기 전에 먼저 합계부터 확인하세요.
모든 걸 어긋나게 만드는 실수: "낸 돈"과 "내야 할 돈"의 혼동
가장 흔한 실수이고, 겉보기엔 그럴듯해 보입니다.
많은 사람이 지출 건별로 생각합니다. "알리스가 300유로를 냈으니 각자 100유로씩 줘야지." 그다음 장보기에 대해서도 "브뤼노가 90유로를 냈으니 각자 30유로씩 줘야지." 결과는 이렇습니다. 클로에는 알리스에게 100유로, 브뤼노에게 30유로를 줘야 하고, 알리스는 브뤼노에게 30유로를, 브뤼노는 알리스에게 100유로를 줘야 합니다. 송금은 네 번인데, 그중 두 건은 서로 엇갈립니다.
잔액 기준으로 생각하면 같은 결과를 단 두 번의 송금으로 만들어낼 수 있습니다. 이 차이는 사소하지 않습니다. 송금 한 건 한 건이 깜빡하거나, 금액을 잘못 입력하거나, 누군가를 기다리게 만들 기회가 되기 때문입니다.
정산을 끝내는 가장 짧은 경로
잔액이 정해지면 남은 건 누가 누구에게 낼지 정하는 일입니다. 방법은 이렇습니다. 채무자와 채권자를 정렬한 뒤, 가장 큰 빚을 가장 큰 채권으로 갚아나가면서 아무것도 남지 않을 때까지 반복합니다.
위 예시로 보면, 클로에는 130을, 브뤼노는 40을 내야 하고, 알리스는 170을 받아야 합니다. 클로에가 알리스에게 130유로를 보내고, 브뤼노가 알리스에게 40유로를 보내면 끝입니다. 송금 두 번으로 모두의 잔액이 0이 됩니다.
기억해 둘 상한선이 있습니다. n명이 있을 때 필요한 송금 횟수는 n − 1을 절대 넘지 않습니다. 다섯 명이라면 네 번이면 항상 충분하고, 실제로는 두세 번으로 끝나는 경우가 많습니다. 계산 결과가 그보다 많다면 아직 지출 건별로 계산하고 있다는 뜻입니다.
나누어떨어지지 않는 원 단위
세 명이서 10유로짜리 지출을 나눕니다. 각자 3.333...유로씩 내야 합니다. 센트 단위로는 3.33 아니면 3.34밖에 쓸 수 없고, 3.33 × 3 = 9.99입니다. 1센트가 모자랍니다.
이걸 그냥 버리는 게 최악의 선택입니다. 합계가 실제 지출 금액과 달라지고, 0이 되어야 할 불변식이 깨집니다. 지출이 백 건쯤 쌓이면 오차가 눈에 띄게 되고, 정산 내역 자체의 신뢰도가 떨어집니다.
올바른 방법은 최대 잔여값법이라고 부릅니다. 먼저 각자의 몫을 내림해서 배분한 뒤, 남은 센트를 소수점 이하 값이 가장 큰 사람부터 순서대로 나눠줍니다. 세 명이 1유로를 나눌 때는 0.34, 0.33, 0.33이 됩니다. 합계는 정확히 1유로입니다.
짚어볼 가치가 있는 조건이 두 가지 있습니다.
- 몫의 합은 항상 지출 금액과 정확히 일치해야 합니다, 센트 단위까지.
- 분배 방식은 결정적이어야 합니다. 같은 데이터로 두 번 계산해도 같은 결과가 나와야 합니다. 화면마다 1센트가 왔다 갔다 하면 명백한 오류보다 더 확실하게 신뢰를 무너뜨립니다.
지출을 나누는 네 가지 방법
모든 지출이 똑같이 나뉘는 건 아니고, 그것만 할 줄 아는 정산 도구는 결국 편법을 쓰게 만듭니다.
| 방식 | 언제 | 예시 |
|---|---|---|
| 균등 분배 | 가장 흔한 경우 | 장보기, 주유 |
| 지분 배분 | 누군가 두 배로 계산되는 경우 | 친구 모임 속 커플, 2인용 방 |
| 비율 배분 | 미리 정해진 고정 비율 | 소득에 비례한 40 / 60 |
| 정확한 금액 | 영수증에 누가 무엇을 먹었는지 나와 있는 경우 | 레스토랑, 항목별 청구서 |
모두에게 해당하지 않는 지출
첫날 저녁이 지나면 가장 흔하게 생기는 상황이고, 스프레드시트를 가장 많이 망가뜨리는 경우이기도 합니다.
여섯 명 중 네 명이 레스토랑에 갔습니다. 92유로짜리 영수증은 여섯 명이 아니라 네 명이 나눠야 합니다. "화요일 소그룹"을 위해 별도의 정산표를 새로 만들지 않고도, 각자의 잔액이 이 사실을 즉시 반영해야 합니다.
그래서 쓸모 있는 정산 도구는 모임의 구성원이 아니라 지출별 참가자 단위로 계산합니다. 모임은 누가 보고 입력할 수 있는지를 정하고, 지출은 누가 부담하는지를 정합니다.
Kotisso가 실제로 하는 일
Kotisso는 지금까지 설명한 내용을 그대로 구현합니다. 모든 지출은 네 가지 방식 중 하나로 배분되고, 잔액은 모든 사용자에게 실시간으로 다시 계산되며, 0이 되어야 할 불변식이 검증되고, 정산 계획은 가장 짧은 경로를 제안합니다.
특별히 짚고 넘어갈 만한 두 가지가 있습니다.
- 환율은 입력 시점에 고정됩니다. 바트로 결제한 지출은 입력할 때 사용자가 입력한 환율로 한 번만 변환되고, 이후로는 절대 바뀌지 않습니다. 매번 당일 환율을 가져온다면 여행이 끝난 지 석 달이 지나서도 매일 아침 모두의 잔액이 흔들리게 됩니다.
- 정산 내역을 내보낼 수 있습니다, 스프레드시트나 PDF로. 파일에는 사람마다 열이 하나씩 있고, 각 행의 합은 0이 되며, 각자의 열 합계는 그 사람의 최종 잔액이 됩니다. 이렇게 하면 불변식을 엑셀에서 직접 검증할 수 있고, 어떤 설명보다 빠르게 논쟁을 끝낼 수 있습니다.
정산 기능은 전부 무료입니다. 네 가지 배분 방식, 내보내기, 영수증 첨부, 정산 계획까지 전부요.
자주 나오는 질문
지출할 때마다 바로 갚아야 하나요? 아닙니다, 오히려 비효율적입니다. 결과는 같은데 송금 횟수만 늘어납니다. 잔액은 그대로 쌓아두고, 여행이 끝날 때 한 번에 정산하거나 함께 사는 경우라면 한 달에 한 번 정산하면 됩니다.
모임 밖의 사람을 위해 누군가 대신 냈다면 어떻게 하나요? 그 사람을 가상의 멤버로 만들지 마세요. 실제로 나눠진 금액대로 지출을 기록하고, 외부인의 몫은 나중에 돈이 들어올 때 상환으로 처리하거나 별도의 지출로 다뤄주세요.
중간에 사람을 추가할 수 있나요? 네, 그리고 그 사람의 잔액은 0부터 시작합니다. 이전 지출은 명시적으로 수정해서 포함시키지 않는 한 그 사람과 무관합니다. 이게 맞는 동작이고, 동시에 가장 많이들 놀라는 부분이기도 합니다.
잔액이 끝내 정산되지 않으면 어떻게 되나요? 상환이 기록될 때까지 정산 내역에 남아 모두에게 보입니다. 빚이 있는 상태로는 모임을 나갈 수 없는 이유도 여기에 있습니다. 그렇게 하면 다른 사람들의 정산 내역에서 돈이 사라져 버리기 때문입니다.