세특 탐구 주제 시리즈 #12 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 공통수학2의 원의 방정식과 연립방정식입니다.

지도 앱을 켜면 파란 점이 내 위치에 딱 찍힙니다. 스마트폰은 내가 어디 있는지 어떻게 알까요? 답은 "거리를 잰다"입니다. 위치를 알고 있는 곳 몇 군데에서 나까지의 거리를 알면, 원 몇 개를 그려 겹치는 점을 찾으면 됩니다. GPS, 드론, 자율주행차, 물류 로봇이 모두 이 원리를 씁니다. 이번 글에서는 기지국 세 개와 원의 방정식으로 내 위치를 직접 계산해 보겠습니다. 실제 GPS는 하늘의 위성을 쓰는 3차원 계산이지만, 원리는 같아서 평면으로 줄여 따라가 봅니다.

주요단어: 스마트폰 위치, GPS 원리, 삼변측량, 원의 방정식, 연립방정식, 자율주행·공학 진로, 공통수학, 고등학교, 주제탐구

① 먼저 알아 둘 것, 거리는 시간으로 잰다

원은 한 점에서 거리가 같은 점들의 모임입니다. 중심이 (a, b), 반지름이 r인 원의 방정식은 (x − a)2 + (y − b)2 = r2입니다.

거리는 줄자로 잴 수 없으니 시간을 잽니다. 전파는 1초에 약 300,000km를 갑니다. 신호가 기지국에서 내 폰까지 오는 데 걸린 시간을 알면 거리 = 속력 × 시간으로 계산합니다.

  • 신호가 0.0000167초(16.7μs) 걸렸다면: 300,000 × 0.0000167 ≈ 5km
  • 신호가 0.0000333초(33.3μs) 걸렸다면: 300,000 × 0.0000333 ≈ 10km

μs(마이크로초)는 100만분의 1초입니다. 전파가 워낙 빨라서 이렇게 작은 단위가 나옵니다. 이 숫자는 ⑤에서 다시 중요해집니다.

② 기지국이 하나뿐이면 원 위 어디든

지도에 좌표를 잡고 1km를 1로 놓겠습니다. 기지국 A가 원점 (0, 0)에 있고, 내 폰까지 거리가 5km라고 나왔습니다. 그러면 나는

x2 + y2 = 25

위의 어느 점에 있습니다. (5, 0), (3, 4), (0, 5), (−4, 3)을 넣어 보면 모두 25가 나옵니다. 둘레가 2 × 3.14 × 5 ≈ 31.4km인 원 위 어디든 가능하니, 기지국 하나로는 위치를 정할 수 없습니다.

③ 기지국 두 개면 두 점으로 좁혀진다

기지국 B가 (8, 0)에 있고, 여기서도 거리가 5km로 나왔습니다. 이제 두 원의 방정식을 동시에 만족하는 점을 찾으면 됩니다.

  1. A의 원: x2 + y2 = 25
  2. B의 원: (x − 8)2 + y2 = 25를 전개하면 x2 − 16x + 64 + y2 = 25
  3. 1번 식에서 2번 식을 빼면 x2과 y2이 지워지고 16x − 64 = 0, 즉 x = 4
  4. x = 4를 1번 식에 넣으면 16 + y2 = 25, y2 = 9, y = 3 또는 y = −3

후보가 (4, 3)과 (4, −3) 두 곳으로 줄었습니다. 두 원이 두 점에서 만나니 당연한 결과입니다. 둘 중 어디인지는 아직 모릅니다.

④ 기지국 세 개면 한 점이 된다

세 번째 기지국 C가 (12, 9)에 있고 거리가 10km로 나왔습니다. 앞에서처럼 전개해서 A의 식과 빼 봅시다.

  1. C의 원: (x − 12)2 + (y − 9)2 = 100
  2. 전개: x2 − 24x + 144 + y2 − 18y + 81 = 100
  3. x2 + y2 자리에 A의 식 25를 넣으면 25 − 24x − 18y + 225 = 100
  4. 정리하면 24x + 18y = 150, 양변을 6으로 나누면 4x + 3y = 25

③에서 얻은 x = 4를 넣으면 16 + 3y = 25, y = 3입니다. 다른 후보 (4, −3)은 4 × 4 + 3 × (−3) = 7이라 25가 아니니 탈락합니다. 내 위치는 (4, 3)입니다. 검산으로 C까지 거리를 구해 보면 √((12 − 4)2 + (9 − 3)2) = √(64 + 36) = √100 = 10으로 맞습니다.

이 계산에서 눈여겨볼 점이 하나 있습니다. 원의 방정식은 이차식인데, 두 식을 빼면 x2과 y2의 계수가 둘 다 1이라 깔끔하게 사라지고 직선의 방정식만 남습니다. 어려운 연립이차방정식이 쉬운 연립일차방정식 두 개로 바뀌는 셈입니다. 그림3을 보면 두 원의 교점을 지나는 직선이 바로 이 직선입니다. 세 원 문제가 결국 직선 두 개의 교점 찾기가 됩니다.

⑤ 100만분의 1초가 틀리면

현실의 시간 측정에는 오차가 있습니다. C에서 온 신호의 시간을 1μs 늦게 쟀다고 해 봅시다. 거리는 300,000km × 0.000001 = 0.3km만큼 늘어 10.3km로 계산됩니다.

  1. ④의 3번 줄에서 오른쪽 100 대신 10.32 = 106.09를 넣으면 250 − 24x − 18y = 106.09
  2. 24x + 18y = 143.91이고, x = 4를 넣으면 18y = 143.91 − 96 = 47.91
  3. y = 47.91 ÷ 18 ≈ 2.662

계산된 위치는 (4, 2.662)로, 진짜 위치 (4, 3)에서 0.338km, 약 338m 떨어진 곳입니다. 3μs를 틀리면 거리는 10.9km가 되고 같은 방법으로 y = (250 − 118.81 − 96) ÷ 18 ≈ 1.955, 약 1,045m가 어긋납니다.

세 거리 모두에 ±0.3km씩 오차가 있으면 원이 선이 아니라 두께 0.6km의 띠가 됩니다(그림4). 세 띠가 겹치는 영역의 넓이를 격자로 세어 보면 약 0.37km2, 축구장 50개쯤 되는 넓이입니다. 위치를 한 점으로 못 박지 못하고 이 안 어딘가라고만 말할 수 있습니다.

그래서 GPS 위성에는 원자시계가 실려 있습니다. 그런데 위성은 빠르게 움직이고 지구 중력에서 멀리 있어서, 상대성이론 효과로 위성 시계가 하루에 약 38μs씩 빨라집니다. 이걸 보정하지 않으면 300,000km × 0.000038 ≈ 11.4km, 하루에 10km 넘게 위치가 어긋납니다. 고등학교 수학 계산 하나로 상대성이론이 생활에 얼마나 가까운지 확인할 수 있습니다.

⑥ 진짜 GPS는 왜 위성이 4개 필요할까

위성은 하늘에 있으니 실제 계산은 원이 아니라 구입니다. 구는 (x − a)2 + (y − b)2 + (z − c)2 = r2로 미지수가 x, y, z 세 개라 위성 3개가 필요합니다. 여기에 문제가 하나 더 있습니다. 위성 시계는 정확하지만 내 스마트폰 시계는 싸구려라 몇 μs씩 틀립니다. ⑤에서 본 것처럼 1μs면 300m입니다. 그래서 "내 폰 시계가 얼마나 틀렸는가"까지 미지수로 놓고, 미지수 4개(x, y, z, 시계 오차)를 풀기 위해 위성 4개의 신호를 씁니다. 미지수 개수만큼 식이 필요하다는, 연립방정식의 기본 원리 그대로입니다.

⑦ 자율주행과 드론의 눈으로 보면

도로 한 차선의 폭은 보통 3~3.5m입니다. 자율주행차가 내가 몇 번째 차선에 있는지 알려면 위치 오차가 1m 안쪽이어야 합니다. 전파가 1m를 가는 데 걸리는 시간은 1 ÷ 300,000,000 ≈ 0.0000000033초, 3.3ns(나노초, 10억분의 1초)입니다. 이 정도로 정밀하게 시간을 맞추기가 쉽지 않아서, 자율주행차는 GPS만 믿지 않고 카메라, 라이다, 바퀴 회전수를 함께 씁니다. 라이다도 빛이 물체에 맞고 돌아오는 시간으로 거리를 재니, 결국 같은 "시간 → 거리 → 원(구)" 계산입니다.

실내에서 GPS가 안 잡히는 물류 창고 로봇이나 드론은 천장에 단 신호기 3~4개로 같은 계산을 합니다. 기지국이 4개 이상이면 원들이 한 점에서 정확히 만나지 않으니, 모든 원에 가장 가까운 점을 고르는 방법(최소제곱법)을 씁니다. 이건 시리즈의 선형회귀 글과 이어지는 내용입니다.

⑧ 직접 위치 계산기를 만들어 보기

④의 방법을 일반적인 식으로 바꿔 코드로 옮겼습니다. 원 1의 식에서 원 2의 식을 빼면 언제나

2(x2 − x1)x + 2(y2 − y1)y = r12 − r22 − x12 + x22 − y12 + y22

꼴의 직선이 나옵니다. A와 B로 16x = 64, A와 C로 24x + 18y = 150을 만든 뒤 연립방정식을 소거법으로 풀면 x = (c1b2 − c2b1) ÷ (a1b2 − a2b1)입니다. 숫자를 넣으면 a1b2 − a2b1 = 16 × 18 − 24 × 0 = 288이고, x = (64 × 18 − 150 × 0) ÷ 288 = 1,152 ÷ 288 = 4, y = (16 × 150 − 24 × 64) ÷ 288 = 864 ÷ 288 = 3입니다. 왼쪽은 자바스크립트, 오른쪽은 파이썬입니다.

자바스크립트파이썬
function locate(t1, t2, t3) {
  // t = [x, y, r]
  const line = (p, q) => [
    2 * (q[0] - p[0]),
    2 * (q[1] - p[1]),
    p[2]**2 - q[2]**2 - p[0]**2 + q[0]**2
      - p[1]**2 + q[1]**2
  ];
  const [a1, b1, c1] = line(t1, t2);
  const [a2, b2, c2] = line(t1, t3);
  const D = a1 * b2 - a2 * b1;
  return [(c1 * b2 - c2 * b1) / D,
          (a1 * c2 - a2 * c1) / D];
}

console.log(locate([0,0,5], [8,0,5], [12,9,10]));
// [4, 3]
console.log(locate([0,0,5], [8,0,5], [12,9,10.3]));
// [4, 2.6616...]
def locate(t1, t2, t3):
    # t = (x, y, r)
    def line(p, q):
        return (2 * (q[0] - p[0]),
                2 * (q[1] - p[1]),
                p[2]**2 - q[2]**2 - p[0]**2 + q[0]**2
                - p[1]**2 + q[1]**2)
    a1, b1, c1 = line(t1, t2)
    a2, b2, c2 = line(t1, t3)
    D = a1 * b2 - a2 * b1
    return ((c1 * b2 - c2 * b1) / D,
            (a1 * c2 - a2 * c1) / D)

print(locate((0,0,5), (8,0,5), (12,9,10)))
# (4.0, 3.0)
print(locate((0,0,5), (8,0,5), (12,9,10.3)))
# (4.0, 2.6616...)

D가 0이 되면 나눗셈을 할 수 없습니다. 기지국 세 개가 한 직선 위에 있을 때 그렇게 됩니다. 실제로 A(0, 0), B(8, 0), C(12, 0)을 넣어 보면 위아래 두 후보를 구별하지 못하는 ③의 상황으로 돌아갑니다. 기지국을 일렬로 세우지 않는 이유를 코드로 확인할 수 있습니다.

⑨ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "거리만 알면 위치를 정할 수 있을까? 몇 개의 거리가 필요할까?" → 가설: 평면에서는 기준점 3개(한 직선 위에 있지 않은)까지의 거리로 위치가 하나로 정해진다.
  2. 자료 수집과 계산: 운동장이나 교실 바닥에 좌표를 잡고 기준점 세 곳에서 줄자로 거리를 잰 뒤, 원의 방정식을 빼는 방법으로 위치를 계산해 실제 위치와 비교한다. 줄자 대신 소리가 도착하는 시간 차를 스마트폰 녹음으로 재 보는 것도 좋다(소리 속력 약 340m/s).
  3. 그래프: 세 원과 두 직선의 교점(그림3), 측정 오차를 키웠을 때 위치 오차가 어떻게 변하는지(그림5)를 그린다.
  4. 결론과 한계: "기준점 3개의 거리로 위치를 구했고, 거리 오차 30cm일 때 위치 오차는 몇 cm였다"처럼 숫자로 쓴다. 한계로는 측정 오차 때문에 세 원이 한 점에서 만나지 않는다는 점, 실제 GPS는 3차원과 시계 오차 때문에 위성 4개가 필요하다는 점을 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • 기지국 세 개를 어떻게 배치하면 같은 시간 오차에서도 위치 오차가 가장 작을까? (정삼각형 배치와 한쪽에 몰린 배치 비교)
  • 기지국이 4개이고 원들이 한 점에서 만나지 않을 때, 가장 그럴듯한 위치는 어떻게 정할까?
  • 지진이 났을 때 관측소 세 곳의 기록으로 진앙을 찾는 방법도 같은 원리일까?

함께 읽으면 좋은 시리즈 글

다음 글 예고: 규모 7 지진은 규모 5 지진보다 몇 배나 강할까요? 2배도, 10배도 아닙니다. 다음 시리즈에서는 상용로그로 지진 규모와 에너지를 직접 계산해 봅니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

세특 탐구 주제 시리즈 #11 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 확률과 통계의 조건부확률입니다.

정확도 99%인 검사를 받았는데 양성이 나왔습니다. 그럼 내가 정말 병에 걸렸을 확률은 99%일까요? 대부분 그렇다고 답하지만, 상황에 따라 50%일 수도 있고 9%일 수도 있습니다. 의사, 간호사, 임상병리사처럼 검사 결과를 해석하는 직업이라면 반드시 알아야 하는 계산입니다. 이번 글에서는 가상의 질병 X와 가상의 검사를 놓고, 사람 수를 직접 세어 가며 이 확률을 구해 보겠습니다. 이 글에 나오는 질병과 검사, 수치는 모두 계산을 위해 만든 예시입니다.

주요단어: 조건부확률, 질병 검사 결과, 검사 양성, 위양성, 유병률, 민감도, 특이도, 의학·보건 진로, 확률과 통계, 고등학교, 주제탐구

1분 영상으로 먼저 보기

① 먼저 알아 둘 것, 조건부확률

사건 A가 일어났다는 것을 알 때 사건 B가 일어날 확률을 조건부확률이라 하고 P(B|A)로 씁니다. 계산은 이렇게 합니다.

P(B|A) = P(A∩B) ÷ P(A)

말로 바꾸면 "A인 사람들만 따로 모았을 때, 그 안에서 B인 사람의 비율"입니다. 오늘 계산은 이 한 줄이면 충분합니다. 식보다 사람 수로 세는 편이 훨씬 덜 헷갈려서, 아래에서는 사람 수로 먼저 세고 마지막에 식으로 확인하겠습니다.

② 검사의 "정확도 99%"가 뜻하는 것

검사가 틀리는 방법은 두 가지입니다. 병이 있는데 음성이 나오는 경우, 병이 없는데 양성이 나오는 경우. 그래서 정확도도 두 개로 나눠 말합니다.

  • 민감도 99%: 실제 환자 100명을 검사하면 99명이 양성으로 나온다.
  • 특이도 99%: 건강한 사람 100명을 검사하면 99명이 음성, 1명은 양성(위양성)으로 나온다.

여기에 하나가 더 필요합니다. 검사받는 사람 가운데 실제 환자가 얼마나 되는지, 즉 유병률입니다. 질병 X의 유병률은 1%라고 하겠습니다. 100명 중 1명꼴로 걸리는 병입니다.

③ 10,000명에게 검사해 보기

10,000명이 모두 이 검사를 받았다고 상상하고 차례대로 나눠 봅시다.

  1. 유병률 1%이니 환자는 10,000 × 0.01 = 100명, 건강한 사람은 10,000 − 100 = 9,900명입니다.
  2. 환자 100명 중 99%인 100 × 0.99 = 99명이 양성, 1명은 음성입니다.
  3. 건강한 9,900명 중 1%인 9,900 × 0.01 = 99명이 양성, 9,801명은 음성입니다.
  4. 양성이 나온 사람은 99 + 99 = 198명입니다.

같은 내용을 표로 정리하면 이렇습니다. 가로는 실제로 병이 있는지, 세로는 검사 결과입니다.

검사 결과 \ 실제 질병 있음 질병 없음 합계
양성 99명 99명
(오류: 위양성)
198명
음성 1명
(오류: 위음성)
9,801명 9,802명
합계 100명 9,900명 10,000명

붉은 칸 두 곳이 검사가 틀린 경우입니다. 병이 없는데 양성이 나온 99명(위양성)과 병이 있는데 음성이 나온 1명(위음성)입니다. 세로로 읽으면 "병이 있는 사람 중 몇 명이 양성인가"(99 ÷ 100 = 99%)이고, 가로로 읽으면 "양성인 사람 중 몇 명이 병이 있는가"(99 ÷ 198)입니다. 같은 표에서 어느 줄을 기준으로 나누느냐에 따라 답이 달라지는데, 이것이 다음 ④에서 계산할 내용입니다.

건강한 사람의 1%는 작은 비율이지만 건강한 사람 자체가 9,900명으로 많습니다. 그래서 1%만 틀려도 99명이 나오고, 이 숫자가 진짜 환자 99명과 똑같아집니다.

④ 양성 198명만 따로 모으면

"양성이 나왔다"는 것은 내가 이 198명 중 한 명이라는 뜻입니다. 그 안에서 진짜 환자는 99명입니다.

99 ÷ 198 = 0.5 → 50%

정확도 99% 검사에서 양성이 나와도 실제 환자일 확률은 동전 던지기와 같은 50%입니다. 이제 ①의 식으로 확인해 봅시다. A를 "양성", B를 "병 있음"이라 하면

  • P(A∩B) = 병이 있으면서 양성 = 99 ÷ 10,000 = 0.0099
  • P(A) = 양성 = 198 ÷ 10,000 = 0.0198
  • P(B|A) = 0.0099 ÷ 0.0198 = 0.5

사람 수로 센 값과 같습니다. 여기서 많이들 하는 실수가 P(양성|병 있음) = 99%와 P(병 있음|양성)을 같은 것으로 보는 것입니다. 조건과 결과의 자리가 바뀌면 전혀 다른 확률이 됩니다.

⑤ 유병률이 달라지면 양성의 의미도 달라진다

같은 검사로 유병률을 세 가지로 바꿔가면서 다시 세어 보겠습니다. 숫자가 소수로 쪼개지지 않도록 0.1%일 때는 100,000명으로 계산했습니다.

유병률 검사 인원 환자 중 양성 건강한 사람 중 양성 양성일 때 환자일 확률
0.1% 100,000명 100 × 0.99 = 99명 99,900 × 0.01 = 999명 99 ÷ 1,098 ≈ 9.0%
1% 10,000명 100 × 0.99 = 99명 9,900 × 0.01 = 99명 99 ÷ 198 = 50%
10% 10,000명 1,000 × 0.99 = 990명 9,000 × 0.01 = 90명 990 ÷ 1,080 ≈ 91.7%

유병률 0.1%인 드문 병이라면 양성이 나와도 환자일 확률은 9%밖에 안 됩니다. 양성 11명 중 10명은 건강한 사람이라는 뜻입니다. 반대로 증상이 있어 병원에 온 사람들처럼 유병률이 10%쯤 되는 집단에서는 같은 검사의 양성이 91.7%의 의미를 갖습니다. 그래프를 보면 검사 정확도를 99.9%로 올려도 유병률이 0.01%까지 내려가면 다시 10% 아래로 떨어집니다. 정리하면, 같은 양성이라도 환자가 많은 집단에서 나온 양성인지 환자가 거의 없는 집단에서 나온 양성인지에 따라 실제로 병일 확률이 달라집니다. 똑같은 검사로 100명 중 1명이 환자인 집단(유병률 1%)에서 양성이 나오면 병일 확률은 50%이고, 1,000명 중 1명이 환자인 집단(유병률 0.1%)에서 나오면 9%입니다.

⑥ 한 번 더 검사하면 어떻게 될까

실제 병원에서는 양성이 나오면 재검사를 합니다. 재검사 결과가 첫 검사와 독립이라고 가정하고, 유병률 1%로 1,000,000명을 놓고 세어 봅시다.

  1. 1,000,000명 중 유병률 1%이니 환자는 1,000,000 × 0.01 = 10,000명, 건강한 사람은 1,000,000 − 10,000 = 990,000명입니다.
  2. 환자 10,000명 중 1차 양성은 10,000 × 0.99 = 9,900명, 그중 2차도 양성은 9,900 × 0.99 = 9,801명
  3. 건강한 990,000명 중 1차 양성은 990,000 × 0.01 = 9,900명, 그중 2차도 양성은 9,900 × 0.01 = 99명
  4. 두 번 다 양성인 사람 중 환자: 9,801 ÷ (9,801 + 99) = 9,801 ÷ 9,900 = 99%

이것은 확률의 곱셈정리입니다. 건강한 사람이 두 번 연속 양성이 나올 확률은 0.01 × 0.01 = 0.0001이라 거의 걸러집니다. 세 번째 검사까지 양성이면 9,801 × 0.99 = 9,702.99명과 99 × 0.01 = 0.99명을 비교해 약 99.99%가 됩니다.

실제 현장에서는 어떻게 할까?

단, 같은 이유로 틀리는 검사라면 독립이라는 가정이 깨집니다. 어떤 사람의 몸 상태 때문에 위양성이 나왔다면 같은 검사를 다시 해도 또 양성일 가능성이 큽니다. 그래서 의료 현장에서는 원리가 다른 검사로 확인하는 경우가 많습니다.

⑦ 음성이 나오면 안심해도 될까

이번엔 거꾸로 물어봅니다. ③의 10,000명 중 음성은 1 + 9,801 = 9,802명이고, 이 가운데 건강한 사람은 9,801명입니다.

9,801 ÷ 9,802 ≈ 0.9999 → 약 99.99%

유병률이 낮을 때 음성은 꽤 믿을 만합니다. 드문 병의 선별검사가 "양성이면 정밀검사, 음성이면 일단 안심"으로 쓰이는 이유가 이 계산에 있습니다.

⑧ 병원 밖의 같은 계산, 스팸 메일 필터

조건부확률은 데이터·AI 분야에서도 똑같이 나옵니다. 하루에 메일 1,000통이 오고 그중 50통(5%)이 스팸이라고 해 봅시다. 필터는 스팸의 98%를 잡아내고, 정상 메일의 2%를 스팸으로 잘못 분류합니다.

  • 스팸함으로 간 스팸: 50 × 0.98 = 49통
  • 스팸함으로 간 정상 메일: 950 × 0.02 = 19통
  • 스팸함에 있는 메일이 진짜 스팸일 확률: 49 ÷ (49 + 19) = 49 ÷ 68 ≈ 72.1%

필터 성능이 98%인데 스팸함 메일의 28% 가까이가 정상 메일입니다. 하루 19통이면 합격 안내 메일 하나쯤은 스팸함에 빠질 수 있다는 얘기입니다. 그래서 스팸 필터를 만드는 사람들은 "얼마나 잘 잡는가"와 함께 "잘못 잡은 것이 얼마나 되는가"를 같이 따집니다.

⑨ 직접 계산기로 만들어 보기

위의 계산을 그대로 코드로 옮겼습니다. 왼쪽은 자바스크립트, 오른쪽은 파이썬입니다. 사람 수 10,000명으로 세는 방식 그대로라 결과를 손계산과 비교하기 좋습니다.

자바스크립트 파이썬
function positiveMeaning(prev, sens, spec) {
  const N = 10000;
  const sick = N * prev;
  const healthy = N - sick;
  const truePos = sick * sens;
  const falsePos = healthy * (1 - spec);
  return truePos / (truePos + falsePos);
}

for (const p of [0.001, 0.01, 0.1]) {
  const v = positiveMeaning(p, 0.99, 0.99);
  console.log(p, (v * 100).toFixed(1) + "%");
}
// 0.001 9.0%
// 0.01 50.0%
// 0.1 91.7%
def positive_meaning(prev, sens, spec):
    N = 10000
    sick = N * prev
    healthy = N - sick
    true_pos = sick * sens
    false_pos = healthy * (1 - spec)
    return true_pos / (true_pos + false_pos)

for p in [0.001, 0.01, 0.1]:
    v = positive_meaning(p, 0.99, 0.99)
    print(p, f"{v * 100:.1f}%")

# 0.001 9.0%
# 0.01 50.0%
# 0.1 91.7%

N을 10,000이 아닌 다른 수로 바꿔도 결과는 같습니다. 분자와 분모에 N이 똑같이 곱해져 약분되기 때문입니다. 한번 바꿔서 확인해 보세요.

⑩ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "정확도 99% 검사에서 양성이면 실제 환자일 확률도 99%일까?" → 가설: 양성의 의미는 검사 정확도뿐 아니라 유병률에 따라 달라진다.
  2. 자료 수집과 계산: 유병률을 0.1%, 1%, 5%, 10%, 30%로 바꿔 가며 10,000명 표를 직접 만들고 P(병|양성)과 P(건강|음성)을 구한다. 위의 코드로 계산 결과를 검산한다.
  3. 그래프: 유병률을 가로축, 양성일 때 환자일 확률을 세로축으로 놓고 정확도별 곡선을 그린다(그림3). 재검사 횟수에 따른 막대그래프(그림4)도 좋다.
  4. 결론과 한계: "유병률 1%일 때 정확도 99% 검사의 양성은 50%의 의미이고, 독립적인 재검사 한 번으로 99%가 된다"처럼 숫자로 쓴다. 한계로는 실제 검사는 민감도와 특이도가 다르다는 점, 재검사의 독립 가정이 현실에서 늘 맞지는 않다는 점을 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • 민감도 90%·특이도 99.9%인 검사와 민감도 99.9%·특이도 90%인 검사는 언제 각각 유리할까?
  • 공항 보안검색, 스팸 필터, 화재경보기에서 위양성과 위음성 중 어느 쪽이 더 큰 비용일까?
  • 나라 전체를 검사하는 것과 증상이 있는 사람만 검사하는 것은 어떤 차이가 있을까?

함께 읽으면 좋은 시리즈 글

다음 글 예고: 지도 앱은 내가 어디 있는지 어떻게 알까요? 다음 시리즈에서는 원의 방정식 세 개를 연립해 스마트폰의 위치를 직접 계산해 봅니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

수학 탐구 보고서나 세특 주제를 정할 때 가장 많이 듣는 고민은 "교과서 밖의 이야기를 하고 싶은데, 너무 어렵지 않으면서 수업 내용과 연결되는 주제가 뭘까?"입니다. 좋은 탐구 주제는 ① 생활 속 질문에서 출발하고, ② 배운 단원으로 직접 계산할 수 있으며, ③ 한 단계 더 확장할 여지가 있는 주제입니다.

이 기준으로 고등학교 수학과 바로 연결되는 생활 속 수학 탐구 주제 12가지를 골라 정리했습니다. 각 주제마다 관련 단원, 탐구 질문, 확장 방향을 함께 적어 두었습니다.

주요단어: 수학 탐구 주제, 세특, 탐구보고서, 생활 속 수학, 지수, 로그, 수열, 확률, 통계, 정수, 고등학교, 주제탐구

대수: 지수함수와 로그함수

1. 72의 법칙: 원금이 두 배가 되는 기간

  • 탐구 질문: 왜 "72 ÷ 금리"로 두 배가 되는 기간을 구할 수 있을까? 왜 하필 72일까?
  • 핵심 수학: 지수방정식 (1 + r)t = 2 를 로그로 풀기, 금리 × 기간이 거의 일정함을 표로 확인
  • 확장: 금리 구간별 오차 그래프 그리기, 세 배가 되는 기간(114의 법칙)
  • 자세한 내용: 72의 법칙은 왜 성립할까?

2. 베버-페히너 법칙: 우리는 왜 로그로 느낄까

  • 탐구 질문: 전구가 2개에서 3개가 될 때와 10개에서 11개가 될 때, 밝기 변화가 다르게 느껴지는 이유는?
  • 핵심 수학: 비율 일정 → 로그함수 꼴의 감각량
  • 확장: 데시벨(10dB 증가 = 소리 세기 10배), 지진 규모(1 증가 = 에너지 약 31.6배)와 비교
  • 자세한 내용: 로그를 활용한 베버-페히너 법칙 탐구

3. 탄소 연대 측정: 유물의 나이를 어떻게 알까

  • 탐구 질문: 남아 있는 탄소-14의 비율만으로 몇 년 전 생물인지 어떻게 계산할까?
  • 핵심 수학: 반감기 약 5,730년, 남은 비율 = (1/2)t/5730 을 로그로 풀기
  • 확장: 측정 오차가 1% 있을 때 추정 연대가 얼마나 달라지는지 분석하기
  • 자세한 내용: 지수와 로그를 이용한 탄소 연대 측정의 원리

대수: 수열

4. 대출 원리금균등상환과 정기예금·적금: 매달 내는 돈과 받는 이자는 어떻게 정해질까

  • 탐구 질문: 은행은 매달 같은 금액을 갚게 하는데, 그 금액은 어떤 식으로 계산될까?
  • 핵심 수학: 등비수열의 합. 대출금 P, 월이율 i, 상환 개월 수 n일 때 매월 상환액 A = P·i·(1+i)n ÷ {(1+i)n − 1}
  • 예시: 1억 원을 연 4.8%(월 0.4%), 30년(360개월)으로 빌리면 매달 약 52만 5천 원, 총 상환액은 약 1억 8,900만 원
  • 확장: 원금균등상환과 총이자 비교, 정기예금의 단리(등차수열)와 복리(등비수열) 비교, 적금 이자가 생각보다 적은 이유
  • 자세한 내용: 대출 상환액과 예금·적금 이자는 어떻게 정해질까?

5. 약은 왜 정해진 간격으로 먹을까

  • 탐구 질문: 같은 양의 약을 반복해서 먹으면 몸속 약물 농도는 끝없이 올라갈까?
  • 핵심 수학: 복용 간격마다 남는 비율이 p라면, n번째 복용 직후 농도는 D(1 + p + p² + … + pn−1) = D(1 − pn) ÷ (1 − p) (등비수열의 합). n을 키워 가며 계산해 보면 이 값이 D ÷ (1 − p)보다 커지지 않고 점점 그 값에 다가감을 표로 확인할 수 있음
  • 확장: 복용 간격(p)을 바꾸면 농도가 어디까지 올라가는지, 처음에 두 배 용량을 먹는 경우와 비교하기
  • 자세한 내용: 약은 왜 12시간마다 먹을까?

6. 로지스틱 성장: 인구와 감염병은 왜 S자로 늘어날까

  • 탐구 질문: 처음에는 지수적으로 늘다가 어느 순간 증가가 둔해지는 이유는?
  • 핵심 수학: 점화식 an+1 = an + k·an(1 − an/M)
  • 확장: 스프레드시트로 k 값을 바꿔 가며 그래프 비교, 실제 통계 자료와 맞춰 보기
  • 자세한 내용: 생물의 수는 왜 끝없이 늘지 않을까?

확률과 통계

7. 여론조사의 "오차범위 ±3.1%p"는 어디서 나올까

  • 탐구 질문: 1,000명만 조사했는데 어떻게 전체 국민의 생각을 추정할 수 있을까?
  • 핵심 수학: 모비율의 추정. 신뢰도 95%에서 오차 ≈ 1.96 × √{p(1 − p) ÷ n}, n = 1000, p = 0.5 이면 약 ±3.1%p
  • 확장: 표본 수를 4배로 늘리면 오차가 절반이 되는 이유
  • 자세한 내용: 여론조사 오차범위 ±3.1%p는 어디서 나올까?

8. 로또 1등 확률과 기댓값

  • 탐구 질문: 6/45 로또의 1등 확률은 얼마이고, 1장의 기댓값은 가격보다 클까?
  • 핵심 수학: 조합 ₄₅C₆ = 8,145,060, 기댓값의 정의
  • 확장: 당첨금이 이월될 때 기댓값 변화, 연속 번호가 나올 확률
  • 자세한 내용: 로또 한 장의 기댓값은 얼마일까?

9. 다인자 유전: 키는 왜 정규분포를 닮았을까

정수·행렬·알고리즘

10. 책 뒤의 ISBN 바코드는 오류를 어떻게 잡아낼까

  • 탐구 질문: 바코드의 마지막 숫자는 왜 있을까?
  • 핵심 수학: ISBN-13은 자리마다 1, 3을 번갈아 곱해 더한 값이 10의 배수가 되도록 마지막 숫자를 정함(나머지 연산). 예: 978-0-306-40615-7
  • 확장: 숫자 하나를 잘못 입력한 경우는 항상 잡아내지만, 이웃한 두 숫자를 바꿔 쓴 경우는 못 잡는 경우가 있는 이유
  • 자세한 내용: 책 뒤 ISBN 바코드는 오류를 어떻게 잡을까?

11. RSA 암호와 소인수분해

12. 선형회귀: 데이터에 가장 잘 맞는 직선 찾기

탐구 주제를 고를 때 팁

  • 결론보다 질문이 중요합니다. "72의 법칙을 조사했다"보다 "왜 69.3이 아니라 72인지 오차를 계산해 확인했다"가 훨씬 좋은 탐구입니다.
  • 직접 계산하거나 그래프를 그린 흔적을 남기세요. 엑셀, 지오지브라, 파이썬 등 무엇이든 괜찮습니다.
  • 한 단계 확장하세요. 조건을 바꾸면 결과가 어떻게 달라지는지 보는 것만으로도 탐구의 깊이가 달라집니다.
  • 진로와 연결하세요. 경제·경영이라면 4번, 의약·생명이라면 5·9번, 컴퓨터·공학이라면 10~12번이 자연스럽게 이어집니다.

각 주제는 앞으로 하나씩 자세한 탐구 글로 정리해 이 목록에 링크를 추가하겠습니다.

세특 탐구 주제 시리즈 #10 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 대수의 거듭제곱근, 지수의 확장, 등비수열입니다.

A4 용지를 반으로 접으면 A5가 되고, A5를 또 반으로 접으면 A6이 됩니다. 크기는 절반씩 줄어드는데 모양은 신기하게도 그대로입니다. 그런데 A4의 크기는 왜 하필 210mm × 297mm라는 어중간한 숫자일까요? 포스터를 키우고 도면을 줄여 출력하는 일이 많은 공학·디자인·건축 분야에서는 이 비율을 모르면 일이 꼬입니다. 이번 글에서는 A4 용지의 크기를 처음부터 직접 계산해 보겠습니다.

주요단어: A4 용지 비율, 루트2, 공학, 거듭제곱근, 지수 확장, 등비수열, 복사기 배율, 대수, 고등학교, 주제탐구

1분 영상으로 먼저 보기

① 먼저 알아 둘 것, 모양이 같다는 것은 비율이 같다는 것

두 직사각형의 크기는 달라도 "긴 변 ÷ 짧은 변"이 같으면 모양이 같습니다(닮음). 실제 A4 용지로 계산해 보면 297 ÷ 210 ≈ 1.4143입니다. A5(148mm × 210mm)는 210 ÷ 148 ≈ 1.4189로 거의 같습니다. 이 1.414… 근처의 숫자가 이번 글의 주인공입니다.

② 아무 종이나 반으로 접으면 모양이 바뀐다

먼저 다른 비율의 종이로 실험해 봅시다. 종이를 반으로 접는다는 것은 긴 변을 반으로 자른다는 뜻입니다.

처음 종이 긴 변 ÷ 짧은 변 반으로 접은 종이 긴 변 ÷ 짧은 변
20cm × 10cm 20 ÷ 10 = 2 10cm × 10cm 1 (정사각형)
30cm × 20cm 30 ÷ 20 = 1.5 20cm × 15cm 20 ÷ 15 ≈ 1.333
16.18cm × 10cm (황금비) 1.618 10cm × 8.09cm 10 ÷ 8.09 ≈ 1.236

2:1 종이는 접으면 정사각형이 되고, 3:2나 황금비 종이도 접을 때마다 모양이 달라집니다. 아름다운 비율로 유명한 황금비도 이 일에는 맞지 않는다는 게 재미있죠.

③ 접어도 모양이 같은 비율 찾기

짧은 변을 1, 긴 변을 r이라고 두고 식을 세웁니다.

  1. 반으로 접으면 긴 변 r이 r/2가 됩니다. 이제 종이의 두 변은 1과 r/2입니다.
  2. r이 2보다 작으면 r/2는 1보다 작으니, 새 종이의 긴 변은 1, 짧은 변은 r/2입니다.
  3. 새 비율은 1 ÷ (r/2) = 2/r입니다. 표로 확인해 보면 r = 1.5일 때 2 ÷ 1.5 ≈ 1.333으로 위와 같습니다.
  4. 접기 전후 모양이 같으려면 r = 2/r이어야 합니다. 양변에 r을 곱하면 r2 = 2이고, r은 양수이니 r = √2입니다.

그래프로 그리면 y = r 직선과 y = 2/r 곡선이 딱 한 점에서 만나는데, 그 점이 √2입니다. √2가 얼마인지 제곱해 가며 좁혀 봅시다.

  • 1.42 = 1.96 (2보다 작음)
  • 1.412 = 1.9881
  • 1.4142 = 1.999396
  • 1.41422 = 1.99996164 (거의 2)

A4의 297 ÷ 210 ≈ 1.4143과 소수 셋째 자리까지 같습니다. 이 1 : √2 비율을 "백은비"라고 부르기도 합니다.

④ 넓이 1㎡에서 A0 크기 정하기

비율만으로는 크기가 정해지지 않습니다. 국제 표준은 여기에 조건을 하나 더 붙였습니다. "가장 큰 A0의 넓이는 정확히 1㎡." 짧은 변을 x미터라 하면 긴 변은 √2·x미터이니

x × √2·x = √2·x2 = 1

x2에 대해 풀면 x2 = 1/√2 = 2−1/2입니다. 교과서에서 배운 지수의 확장을 쓰면

x = (2−1/2)1/2 = 2−1/4

입니다. 21/4은 "제곱해서 √2가 되는 수", 즉 √(√2)입니다. √1.41421 ≈ 1.18921이므로

  • 짧은 변: 2−1/4 = 1 ÷ 1.18921 ≈ 0.84090m → 841mm
  • 긴 변: √2 × 2−1/4 = 21/2 × 2−1/4 = 21/4 ≈ 1.18921m → 1189mm

표준 A0 크기 841mm × 1189mm가 그대로 나왔습니다. 확인 삼아 곱하면 841 × 1189 = 999,949mm2로, 1㎡ = 1,000,000mm2와 거의 같습니다. 어중간해 보이던 숫자들이 21/4에서 나온 것입니다.

⑤ A0에서 A8까지, 공비 1/√2인 등비수열

A0을 반으로 자르면 A1, A1을 반으로 자르면 A2입니다. 자를 때마다 긴 변은 이전의 짧은 변이 되는데, 모양이 그대로이니 모든 길이가 1/√2 ≈ 0.7071배가 됩니다.

그래서 An 용지의 긴 변은 첫째항 1189.2mm, 공비 1/√2인 등비수열입니다. A4는 n = 4이니 공비를 네 번 곱하면 (1/√2)4 = 1/4이고, 1189.2 ÷ 4 = 297.3mm입니다. 짧은 변도 840.9 ÷ 4 ≈ 210.2mm. A4의 210 × 297이 이렇게 나옵니다.

용지 긴 변 계산 계산값 표준 (mm) 넓이 (㎡)
A0 1189.2 1189.2 841 × 1189 1
A1 1189.2 × 0.7071 840.9 594 × 841 1/2
A2 1189.2 × 0.70712 594.6 420 × 594 1/4
A3 1189.2 × 0.70713 420.4 297 × 420 1/8
A4 1189.2 × 0.70714 297.3 210 × 297 1/16
A5 1189.2 × 0.70715 210.2 148 × 210 1/32
A6 1189.2 × 0.70716 148.7 105 × 148 1/64

표준 값은 A0을 가까운 mm로 반올림해 841 × 1189로 정한 뒤, 긴 변을 반으로 자르고 소수점 아래를 버려서 만듭니다. A1의 짧은 변은 1189 ÷ 2 = 594.5 → 594mm, A5의 짧은 변은 297 ÷ 2 = 148.5 → 148mm인 식입니다. 그래서 계산값과 1mm 안쪽으로 차이가 납니다. 넓이는 공비 1/2인 등비수열이라 A4는 1/16㎡ = 625cm2입니다. 실제 21.0cm × 29.7cm = 623.7cm2와 거의 같죠.

이걸로 재미있는 계산을 하나 할 수 있습니다. 복사용지 포장지에 적힌 "80g"은 1㎡짜리 종이 한 장의 무게입니다. A4는 1/16㎡이니 한 장의 무게는 80 ÷ 16 = 5g이고, 500장 한 묶음은 5 × 500 = 2,500g = 2.5kg입니다. 저울에 올려 보면 실제로 그 근처가 나옵니다.

⑥ 복사기의 141%와 71%

복사기에는 141%, 71% 같은 이상한 배율 버튼이 있습니다. 이제 이유가 보입니다.

  • A4 → A3 확대: 길이를 √2배 해야 하니 1.414 → 141%
  • A3 → A4 축소: 길이를 1/√2배 해야 하니 0.707 → 71% (복사기에 따라 70%로 표시)
  • A5 → A3 확대: 두 단계이니 √2 × √2 = 2 → 200%
  • A4 두 쪽을 A4 한 장에 모아 찍기: 각 쪽이 A5 크기가 되니 71%

길이가 √2배이면 넓이는 (√2)2 = 2배입니다. 그래서 141% 확대는 "두 배로 키우기"인데, 길이가 아니라 넓이가 두 배라는 점에서 많이들 헷갈립니다.

⑦ 공학의 눈으로 보면, 대량생산과 자원 최적화

공학에서 종이 규격을 이렇게 정한 이유를 한마디로 하면, 같은 물건을 엄청나게 많이 만들 때 재료를 하나도 낭비하지 않기 위해서입니다. 한 장에서 1%를 아끼는 것은 별것 아니지만, 수억 장을 만드는 대량생산에서는 그 1%가 공장 하나의 생산량이 됩니다. √2 비율은 이 자원 최적화를 수학으로 해결한 사례입니다. 제지 공장에서 만든 큰 종이를 반으로, 또 반으로 자르기만 하면 A1, A2, A3, A4가 차례로 나오고 버리는 자투리가 하나도 생기지 않습니다. A0 한 장(1㎡)을 네 번 반으로 자르면 24 = 16장의 A4가 나오고, 16장의 넓이를 더하면 16 × 1/16 = 1㎡로 처음 종이를 남김없이 다 씁니다.

비율이 √2가 아니면 어떻게 될까요? A4 대신 210mm × 280mm(비율 3:4) 종이를 같은 841mm × 1189mm 원지에서 잘라 낸다고 해 봅시다.

  • 가로로는 841 ÷ 210 ≈ 4.0이니 4장, 세로로는 1189 ÷ 280 ≈ 4.2이니 4장, 모두 16장이 나옵니다.
  • 16장이 쓰는 넓이는 840mm × 1120mm = 940,800mm2입니다.
  • 원지 넓이 841 × 1189 = 999,949mm2 가운데 999,949 − 940,800 = 59,149mm2, 약 5.9%가 자투리로 버려집니다.

이 차이를 공장 규모로 키워 봅시다. 하루에 A0 원지 10만 장을 자르는 공장이 있다고 가정하겠습니다. 5.9%는 원지 5,900장 분량이고, 80g 종이라면 A0 한 장이 80g이니 5,900 × 80g = 472,000g = 472kg이 매일 버려집니다. 1년에 300일 돌린다면 472kg × 300 = 141,600kg, 약 142톤입니다. √2 비율 하나로 이만큼의 나무와 물, 에너지를 아끼는 셈입니다.

규격이 하나로 정해지면 기계를 만드는 쪽도 편해집니다. 프린터와 복사기의 종이함, 봉투, 파일, 코팅기, 재단기가 모두 A 규격 몇 가지에만 맞추면 되니, 크기마다 다른 부품과 금형을 따로 만들 필요가 없습니다. 같은 부품을 대량으로 찍어 내니 값도 싸집니다. 공학에서 말하는 표준화가 바로 이것이고, 그 밑바탕에 1 : √2라는 계산이 있습니다.

인쇄할 때도 마찬가지입니다. A4 두 쪽을 A4 한 장에 "모아 찍기"하면 각 쪽이 모양 그대로 71%로 줄어들어 여백 낭비 없이 딱 들어맞습니다. 100쪽짜리 자료를 그냥 한 면씩 뽑으면 100장이 들지만, 2쪽 모아 찍기에 양면 인쇄까지 하면 100 ÷ 2 ÷ 2 = 25장이면 됩니다. ⑤에서 구한 A4 한 장 5g으로 계산하면 500g에서 125g으로, 종이 375g을 아끼는 셈입니다. 비율이 √2가 아니었다면 모아 찍을 때마다 위아래나 양옆에 빈 띠가 남았을 겁니다.

⑧ 디자인·건축에서 쓰는 계산

건축 설계에서는 A1 용지에 1:100 축척으로 도면을 그리는 일이 많습니다. 이 도면을 들고 다니기 편한 A3로 출력하면 A1 → A2 → A3, 두 단계 축소이니 길이가 (1/√2)2 = 1/2배가 됩니다. 도면 위 1cm가 실제 100cm였는데 이제 0.5cm가 실제 100cm이니 축척은 1:200이 됩니다. 비율이 그대로라 도면이 잘리거나 여백이 남지 않는다는 점이 √2 비율의 장점입니다.

포스터 디자인도 같습니다. A3 포스터를 A1로 키우면 길이가 2배가 되므로 12pt 글자는 24pt가 됩니다. 처음부터 A3로 디자인해 두면 A1, A2로 바꿔도 다시 배치할 필요가 없습니다. 반면 미국에서 쓰는 레터 용지(8.5인치 × 11인치)는 비율이 11 ÷ 8.5 ≈ 1.294라서, 반으로 접으면 8.5 ÷ 5.5 ≈ 1.545로 모양이 바뀝니다.

⑨ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "A4 용지의 크기는 왜 210mm × 297mm일까?" → 가설: 반으로 접어도 모양이 같도록 1 : √2 비율이고, A0의 넓이가 1㎡가 되도록 크기를 정했다.
  2. 자료 수집과 계산: A3, A4, A5 용지와 공책, 교과서, 사진 인화지의 가로·세로를 자로 재어 비율을 계산한다. 이론값 √2 ≈ 1.4142와 비교하고, 21/4로 A0 크기를 계산해 표준 값과 맞춰 본다.
  3. 그래프: y = r과 y = 2/r 그래프의 교점(그림1), A0~A8 긴 변의 등비수열 그래프(그림3)를 그린다. 측정한 여러 종이의 비율을 막대그래프로 나란히 놓아도 좋다.
  4. 결론과 한계: "A용지는 공비 1/√2인 등비수열이고, A4의 크기는 21/4을 네 번 반으로 나눈 결과다"처럼 계산으로 결론을 쓴다. 한계로는 표준 값이 mm 단위로 버린 값이라 계산값과 1mm 이내로 차이가 난다는 점, 자로 잴 때의 측정 오차를 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • B 용지(B4, B5)는 A 용지와 어떤 관계일까? B0의 넓이를 구해 A0과 비교해 보기.
  • 우리 학교에서 한 학기에 쓰는 A4 용지가 몇 장인지 조사하고, 모아 찍기와 양면 인쇄를 하면 몇 kg의 종이를 아낄 수 있는지 계산해 보기.
  • 세 번 접어도, 열 번 접어도 모양이 같은 종이를 만들려면 r은 무엇이어야 할까?
  • 공책, 스마트폰 화면(16:9), 영화 화면은 왜 √2 비율을 쓰지 않을까?

함께 읽으면 좋은 시리즈 글

다음 글 예고: 정확도 99%인 검사에서 양성이 나왔다면 정말 병에 걸렸을 확률도 99%일까요? 다음 시리즈에서는 조건부확률로 이 직관이 얼마나 틀리는지 직접 계산해 봅니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

세특 탐구 주제 시리즈 #9 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 정수의 나눗셈과 나머지, 그리고 그것으로 만든 오류 검출 장치입니다.

책 뒤표지의 바코드 아래에는 978로 시작하는 13자리 숫자가 있습니다. 이것이 책의 주민등록번호 같은 ISBN입니다. 서점 직원이 이 번호를 손으로 입력하다 숫자 하나를 잘못 치면 어떻게 될까요? 대부분은 컴퓨터가 바로 "잘못된 번호"라고 알려 줍니다. 비밀은 맨 마지막 한 자리, 검증 숫자에 있습니다. 데이터가 오가는 동안 생기는 오류를 잡는 일은 컴퓨터공학과 통신공학의 기본기라서, 이번 글에서는 그 원리를 나머지 계산만으로 직접 따라가 보겠습니다.

주요단어: ISBN, 바코드, 검증 숫자, 나머지, 정수, 오류 검출, 공통수학, 고등학교, 주제탐구

1분 영상으로 먼저 보기

① 먼저 알아 둘 것, 10으로 나눈 나머지는 일의 자리

어떤 자연수를 10으로 나눈 나머지는 그 수의 일의 자리 숫자와 같습니다. 93을 10으로 나누면 몫이 9, 나머지가 3이죠. 그래서 "10의 배수인가?"는 "일의 자리가 0인가?"만 보면 됩니다. 이 글의 계산은 모두 이 사실 하나로 끝납니다.

ISBN-13은 이렇게 생겼습니다. 이 글에서는 수학 문헌에 자주 나오는 예시 번호 978-0-306-40615-7을 씁니다.

  • 978: 책이라는 표시 (979도 씀)
  • 0: 나라·언어권 (우리나라 책은 89 또는 11)
  • 306: 출판사 번호
  • 40615: 책 번호
  • 7: 검증 숫자. 앞의 12자리로 계산해서 정함

② 가장 쉬운 방법부터, 숫자를 그냥 더하면

먼저 가장 단순한 규칙을 생각해 봅시다. "모든 숫자의 합이 10의 배수가 되도록 마지막 숫자를 정한다." 4자리 번호 352에 검증 숫자를 붙이면 3 + 5 + 2 = 10이므로 검증 숫자는 0이고, 번호는 3520이 됩니다.

  • 숫자 하나를 잘못 치는 경우: 3520을 3820으로 치면 합이 13이 되어 10의 배수가 아닙니다. 바로 잡힙니다. 한 숫자가 바뀌면 합은 1~9만큼 변하니 언제나 잡힙니다.
  • 이웃한 두 숫자를 바꿔 치는 경우: 3520을 5320으로 치면 합은 그대로 10입니다. 더하기는 순서를 바꿔도 같으니 하나도 못 잡습니다.

사람이 번호를 입력할 때 가장 흔한 실수가 바로 이 두 가지입니다. 숫자 하나 틀리기와 이웃한 두 숫자 바꾸기. 단순한 합으로는 두 번째 실수를 전혀 못 잡으니, 자리마다 다른 무게를 주는 방법이 필요합니다.

③ ISBN-13의 규칙, 1과 3을 번갈아 곱한다

ISBN-13은 홀수 번째 숫자에는 1을, 짝수 번째 숫자에는 3을 곱해 모두 더합니다. 이 합이 10의 배수가 되도록 13번째 숫자를 정합니다. 978-0-306-40615-?의 앞 12자리로 직접 계산해 봅시다.

자리 1 2 3 4 5 6 7 8 9 10 11 12
숫자 9 7 8 0 3 0 6 4 0 6 1 5
가중치 1 3 1 3 1 3 1 3 1 3 1 3
곱 9 21 8 0 3 0 6 12 0 18 1 15

곱을 차례로 더하면 9 → 30 → 38 → 38 → 41 → 41 → 47 → 59 → 59 → 77 → 78 → 93입니다. 93 다음의 10의 배수는 100이니, 100 − 93 = 7이 검증 숫자입니다. 책에 적힌 마지막 숫자 7과 같습니다.

식으로 쓰면 검증 숫자는 (10 − (합을 10으로 나눈 나머지))를 다시 10으로 나눈 나머지입니다. 합이 마침 10의 배수(나머지 0)면 검증 숫자는 10이 아니라 0이 되도록 한 번 더 나머지를 구하는 것이죠. 학생들이 코드를 짤 때 이 부분을 자주 빠뜨립니다.

집에 있는 책 아무거나 꺼내서 직접 계산해 보세요. 마지막 숫자가 맞아떨어지면 계산을 제대로 한 겁니다.

④ 숫자 하나가 틀리면 반드시 잡힌다

978-0-306-40615-7에서 4번째 숫자 0을 8로 잘못 쳤다고 해 봅시다. 4번째 자리의 가중치는 3이므로 합은 8 × 3 = 24만큼 늘어납니다. 검증 숫자까지 넣은 원래 합 100이 124가 되고, 일의 자리가 4이니 10의 배수가 아닙니다. 오류가 잡혔습니다.

이게 우연이 아니라 항상 그렇다는 걸 확인해 봅시다. 숫자가 k만큼 바뀌면(k는 1~9) 합은 가중치 1인 자리에서 k, 가중치 3인 자리에서 3k만큼 변합니다. k는 10의 배수가 될 수 없고, 3k도 마찬가지입니다.

k 1 2 3 4 5 6 7 8 9
3k 3 6 9 12 15 18 21 24 27
3k의 일의 자리 3 6 9 2 5 8 1 4 7

일의 자리가 0인 칸이 하나도 없습니다. 3과 10이 1 말고는 공약수가 없기(서로소) 때문입니다. 만약 가중치를 3 대신 2나 5로 정했다면 2 × 5 = 10, 5 × 2 = 10처럼 일의 자리가 0이 되는 경우가 생겨 일부 오류를 놓칩니다. 가중치 3은 아무렇게나 고른 숫자가 아닙니다.

⑤ 이웃한 두 숫자를 바꾸면 10번에 1번은 놓친다

이웃한 두 숫자 a, b를 바꿔 치면 하나는 가중치 1에서 3으로, 다른 하나는 3에서 1로 옮겨 갑니다. 원래 a × 1 + b × 3이던 부분이 b × 1 + a × 3이 되니 합의 변화는

(b + 3a) − (a + 3b) = 2a − 2b = 2(a − b)

입니다. 2(a − b)가 10의 배수가 되면 오류를 놓칩니다. a − b가 5나 −5일 때, 즉 두 숫자의 차이가 5일 때입니다.

실제로 해 보겠습니다. 978-0-306-40615-7의 10번째 숫자 6과 11번째 숫자 1은 차이가 5입니다. 두 숫자를 바꾼 978-0-306-40165-7로 합을 다시 구하면, 원래 6 × 3 + 1 × 1 = 19였던 부분이 1 × 3 + 6 × 1 = 9가 되어 합이 100에서 90으로 줄어듭니다. 90도 10의 배수라서 컴퓨터는 이 틀린 번호를 맞는 번호로 받아들입니다.

서로 다른 두 숫자의 순서쌍 90가지를 모두 따져 보면 아래 그림처럼 차이가 5인 10가지만 놓칩니다.

90가지 중 80가지를 잡으니 80 ÷ 90 ≈ 88.9%입니다. 숫자만 더하는 방법(0%)보다 훨씬 낫지만 완벽하지는 않습니다.

⑥ 옛날 ISBN-10은 11로 나누어 완벽했다

2007년 전까지 쓰던 10자리 ISBN은 다른 방법을 썼습니다. 앞자리부터 10, 9, 8, …, 1을 곱해 더한 합이 11의 배수가 되도록 마지막 숫자를 정합니다. 같은 책의 옛 번호 0-306-40615-?로 계산해 봅시다.

0×10 + 3×9 + 0×8 + 6×7 + 4×6 + 0×5 + 6×4 + 1×3 + 5×2 = 0 + 27 + 0 + 42 + 24 + 0 + 24 + 3 + 10 = 130

130을 11로 나누면 몫 11, 나머지 9입니다. 다음 11의 배수 132까지 2가 모자라니 검증 숫자는 2, 번호는 0-306-40615-2입니다. 검증 숫자가 10이 필요할 때는 숫자 대신 X를 씁니다. 옛날 책에서 ISBN 끝이 X인 경우를 볼 수 있는 이유입니다.

11은 소수라서 1~10 중 어떤 두 수를 곱해도 11의 배수가 되지 않습니다. 그래서 숫자 하나가 틀리는 오류와 이웃한 두 숫자를 바꾸는 오류를 모두 100% 잡습니다. (이웃한 두 숫자를 바꾸면 합이 a − b만큼 변하는데, 이것이 11의 배수가 될 수 없습니다.)

⑦ 더 꼼꼼한 10자리를 왜 버렸을까

그림3을 보면 이상한 점이 하나 남습니다. 오류를 잡는 능력만 보면 옛 ISBN-10이 지금의 ISBN-13보다 낫습니다. 이웃한 두 숫자 바꿈을 10자리는 90가지 모두, 13자리는 80가지만 잡으니까요. 그런데도 2007년 1월부터 전 세계 출판계는 13자리로 옮겨 갔습니다. 이유는 정확도가 아닌 곳에 있었습니다.

먼저 번호가 모자랐습니다. 10자리에서 검증 숫자를 빼면 남는 자리는 9자리라서 만들 수 있는 번호는 많아야 109, 곧 10억 개입니다. 많아 보이지만 나라와 출판사마다 번호 묶음을 미리 나눠 주는 방식이라 책을 많이 내는 곳부터 자기 몫이 바닥났습니다. 13자리에서는 978 구역이 옛 번호 10억 개를 그대로 넘겨받고, 979로 시작하는 새 구역에서 10억 개를 더 만들 수 있습니다. 우리나라도 978-89 번호가 부족해지자 979-11로 시작하는 번호를 쓰기 시작했습니다. 최근에 나온 책 뒤표지를 보면 979-11이 많을 겁니다.

세계 공통 바코드와 맞추는 일도 컸습니다. 마트에서 파는 과자, 음료수, 학용품의 바코드는 거의 다 13자리 EAN-13 체계이고, 검증 숫자도 ISBN-13과 똑같이 1과 3을 번갈아 곱해 10으로 나눕니다. 책 번호를 이 체계에 넣으면 서점과 마트 계산대가 책을 과자와 똑같이 찍으면 되니 프로그램을 따로 둘 필요가 없습니다. 978과 979는 이 바코드 안에서 "이 상품은 책"이라는 표시입니다.

끝자리 X도 골칫거리였습니다. 11로 나눈 나머지는 0부터 10까지 11가지인데 한 자리 숫자는 10가지뿐이라 10 자리에 X를 쓴 것이죠. 숫자만 입력받는 계산대 프로그램이나 숫자 키패드에서는 이 글자 하나 때문에 예외 처리를 따로 해야 했습니다. 10으로 나누는 13자리는 검증 숫자가 늘 0~9 안에 들어옵니다.

옛 번호를 새 번호로 바꾸는 방법은 간단합니다. 옛 검증 숫자를 떼고 앞에 978을 붙인 다음, 13자리 규칙으로 끝자리를 새로 계산합니다. 0-306-40615-2에서 2를 떼고 978을 붙이면 978-0-306-40615-?이고, ③에서 계산한 대로 끝자리는 7입니다. 같은 책인데 끝자리가 2에서 7로 바뀝니다.

13자리가 놓치는 실수는 차이가 5인 두 숫자를 이웃해서 바꿔 치는 경우뿐입니다. 게다가 요즘은 사람이 번호를 치기보다 스캐너가 바코드를 읽는 일이 대부분이라 실제로 잃는 것은 크지 않았습니다. 오류를 조금 덜 잡는 대신 번호를 두 배로 늘리고 세계 공통 바코드와 맞춘 셈입니다. 수학적으로 가장 좋은 방법과 실제로 쓰이는 방법이 다를 수 있고, 공학에서는 이런 맞바꿈을 늘 따집니다.

⑧ 직접 검사기를 만들어 보기

계산을 코드로 옮기면 이렇습니다. 왼쪽은 자바스크립트, 오른쪽은 파이썬입니다.

자바스크립트 파이썬
function checkDigit(isbn12) {
  let sum = 0;
  for (let i = 0; i < 12; i++) {
    const w = (i % 2 === 0) ? 1 : 3;
    sum += Number(isbn12[i]) * w;
  }
  return (10 - sum % 10) % 10;
}
console.log(checkDigit("978030640615")); // 7
def check_digit(isbn12):
    total = 0
    for i in range(12):
        w = 1 if i % 2 == 0 else 3
        total += int(isbn12[i]) * w
    return (10 - total % 10) % 10

print(check_digit("978030640615"))  # 7

i가 0부터 시작하므로 i가 짝수일 때가 "홀수 번째 자리"입니다. 마지막 줄의 % 10을 빼면 합이 100처럼 10의 배수일 때 검증 숫자가 10이 되어 버립니다. 직접 짜 보면 ③에서 말한 함정을 몸으로 느낄 수 있습니다.

⑨ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "ISBN 검증 숫자는 입력 실수를 얼마나 잘 잡아낼까?" → 가설: 숫자 하나 틀림은 모두 잡지만, 이웃한 두 숫자 바꿈은 일부를 놓친다.
  2. 자료 수집과 계산: 집과 도서관에서 책 20권의 ISBN을 모아 검증 숫자를 직접 계산해 맞는지 확인한다. 그다음 일부러 숫자 하나를 바꾸거나 이웃한 두 숫자를 바꿔 보고, 잡히는지 기록한다.
  3. 그래프: 이웃한 두 숫자 바꿈을 10×10 표로 정리하고(그림2), 단순 합·ISBN-13·ISBN-10의 검출률을 막대그래프로 비교한다(그림3).
  4. 결론과 한계: "ISBN-13은 숫자 하나 틀림을 100%, 이웃한 두 숫자 바꿈을 88.9% 잡는다. 가중치 3이 10과 서로소이기 때문이다"처럼 수치와 이유로 결론을 쓴다. ISBN-10이 더 꼼꼼한데도 13자리로 바뀐 까닭(번호 부족, 세계 공통 바코드 호환)까지 덧붙이면 수학과 현실의 연결이 드러난다. 한계로는 숫자 두 개가 동시에 틀리는 경우나 멀리 떨어진 두 숫자를 바꾸는 경우는 따로 따져야 한다는 점을 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • 오류 검출은 ISBN-10이 더 뛰어난데 왜 13자리로 바꿨을까? 번호 개수(10자리 대 13자리), 세계 공통 바코드와의 호환, 검출률 88.9%와 100%의 차이를 함께 놓고 "정확도와 호환성 중 무엇을 고를까"를 따져 보기(그림4).
  • 가중치를 1과 3 대신 1과 7로 바꾸면 검출률은 어떻게 될까? 1과 5라면?
  • 주민등록번호, 신용카드 번호(룬 알고리즘), 택배 송장 번호에도 검증 숫자가 있을까? 규칙을 찾아 비교해 보기.
  • QR 코드는 일부가 찢어져도 읽힌다. 오류를 "잡는" 것과 "고치는" 것은 무엇이 다를까?

함께 읽으면 좋은 시리즈 글

다음 글 예고: A4 용지를 반으로 접으면 A5가 되는데, 모양은 그대로입니다. 어떤 비율이어야 이런 일이 생길까요? 다음 시리즈에서는 거듭제곱근과 등비수열로 A4 용지의 크기를 직접 계산해 봅니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

세특 탐구 주제 시리즈 #7 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 확률과 통계의 이항분포, 정규분포, 모비율 추정입니다.

선거철 뉴스에는 늘 같은 문장이 붙습니다. "이번 조사는 전국 만 18세 이상 1,000명을 대상으로 했으며, 95% 신뢰수준에 표본오차는 ±3.1%p입니다." 4,400만 명이 넘는 유권자 가운데 겨우 1,000명에게 물었는데 어떻게 오차가 3.1%p밖에 안 된다고 자신할까요? 그리고 3.1이라는 숫자는 어디서 나왔을까요? 통계학이나 언론·미디어 쪽으로 진로를 생각하는 학생이라면 앞으로 수없이 보게 될 숫자이니, 이번 글에서 직접 계산해 보겠습니다.

주요단어: 여론조사, 오차범위, 표본오차, 신뢰수준, 표본비율, 모비율 추정, 이항분포, 정규분포, 확률과 통계, 고등학교, 주제탐구

① 먼저 알아 둘 것, 전체가 아니라 일부에게 묻는다

알고 싶은 집단 전체를 모집단, 실제로 물어본 사람들을 표본이라고 합니다. 유권자 4,400만 명 모두에게 묻는 일은 선거 그 자체라서, 여론조사는 1,000명 정도의 표본만 뽑아 묻습니다.

이때 표본은 무작위로 뽑아야 합니다. 특정 지역이나 특정 나이대만 골라 물으면 아무리 많이 물어도 전체를 대표하지 못합니다. 그래서 실제 조사에서는 전화번호를 무작위로 만들어 걸고, 지역·성별·나이 비율을 인구 구성에 맞춥니다.

문제는 무작위로 뽑으면 뽑을 때마다 결과가 조금씩 달라진다는 것입니다. 오차범위는 이 흔들림이 얼마나 큰지를 숫자로 나타낸 것입니다.

② 10명, 100명, 1,000명에게 물어보면

어떤 정책에 실제로 찬성하는 사람이 정확히 50%라고 해 봅시다. 여기서 10명을 무작위로 뽑아 물으면 찬성하는 사람 수 X는 이항분포 B(10, 0.5)를 따릅니다. 찬성자가 정확히 5명일 확률을 계산하면 이렇습니다.

P(X = 5) = 10C5 × 0.55 × 0.55 = 252 × 1/1024 = 252/1024 ≈ 0.246

정답인 50%가 나올 확률이 4분의 1도 안 됩니다. 반대로 찬성자가 3명 이하, 즉 "찬성 30% 이하"라는 엉뚱한 결과가 나올 확률도 계산해 볼까요?

찬성자 수계산확률
0명10C0/1024 = 1/10240.0010
1명10C1/1024 = 10/10240.0098
2명10C2/1024 = 45/10240.0439
3명10C3/1024 = 120/10240.1172
합계176/10240.1719

10명에게 물으면 6번에 1번꼴로 "찬성 30% 이하"가 나옵니다. 이런 조사는 믿기 어렵죠. 사람 수를 늘리면 어떻게 될지 100명, 1,000명일 때도 같은 방법으로 모든 경우의 확률을 계산해 그래프로 그렸습니다.

10명일 때는 막대가 0%부터 100%까지 넓게 퍼져 있지만, 1,000명이 되면 거의 모든 결과가 45~55% 사이에 몰립니다. 많이 물을수록 결과가 실제 값 근처로 모인다는 것을 눈으로 확인할 수 있습니다. 이제 이 "퍼진 정도"를 숫자로 계산해 보겠습니다.

③ 표본비율은 얼마나 흩어질까

교과서에서 배운 이항분포의 평균과 표준편차 공식을 그대로 씁니다. X가 B(n, p)를 따르면

E(X) = np,    σ(X) = √(np(1 − p))

1,000명에게 묻고 실제 찬성률이 0.5라면 한 단계씩 넣어 봅니다.

  • 평균: 1000 × 0.5 = 500명
  • 분산: 1000 × 0.5 × 0.5 = 250
  • 표준편차: √250 ≈ 15.81명

뉴스에 나오는 것은 사람 수가 아니라 비율입니다. 찬성 비율 p̂ = X/1000이므로 평균과 표준편차를 모두 1000으로 나눕니다.

  • 표본비율의 평균: 500 ÷ 1000 = 0.5 (실제 찬성률과 같음)
  • 표본비율의 표준편차: 15.81 ÷ 1000 ≈ 0.01581, 즉 약 1.58%p

이 과정을 문자로 정리하면 표본비율의 표준편차는 √(p(1 − p)/n)이 됩니다. 넣어서 다시 확인해 보면 √(0.5 × 0.5 ÷ 1000) = √0.00025 ≈ 0.01581로 같습니다. 여기서 p에 50을 넣는 실수가 많은데, 비율이므로 0.5를 넣어야 합니다.

④ 3.1의 정체는 1.96 × 1.58

n이 충분히 크면 이항분포는 정규분포에 가까워집니다. 그림1의 1,000명 그래프가 종 모양인 것도 그래서입니다. 그러면 표준정규분포표를 쓸 수 있습니다. 표에서 P(0 ≤ Z ≤ 1.96) = 0.4750을 찾으면

P(−1.96 ≤ Z ≤ 1.96) = 0.4750 × 2 = 0.95

즉 표본비율은 95%의 확률로 "실제 비율 ± 1.96 × 표준편차" 안에 들어옵니다. 앞에서 구한 표준편차를 넣으면

1.96 × 0.01581 = 0.0310 → ±3.1%p

뉴스의 "95% 신뢰수준에 ±3.1%p"가 정확히 이 계산입니다. 그런데 실제 찬성률을 모르는데 왜 0.5를 넣었을까요? p(1 − p)는 p가 0.5일 때 가장 커서 오차범위도 가장 크게 나오기 때문입니다.

pp(1 − p)1,000명일 때 오차범위
0.10.091.96 × √(0.09/1000) ≈ ±1.9%p
0.30.211.96 × √(0.21/1000) ≈ ±2.8%p
0.420.24361.96 × √(0.2436/1000) ≈ ±3.06%p
0.50.251.96 × √(0.25/1000) ≈ ±3.10%p

그래서 조사 기관은 "가장 나쁜 경우에도 이 정도"라는 뜻으로 0.5를 넣은 값을 발표합니다. 실제 지지율이 42%로 나온 후보라면 오차범위는 ±3.06%p로 조금 더 좁습니다.

⑤ 95%는 무슨 뜻일까

실제 지지율이 42%인 후보가 있다고 정해 놓고, 컴퓨터로 1,000명 여론조사를 100번 했습니다. 조사마다 나온 지지율에 ±오차범위를 붙여 구간을 그리면 아래와 같습니다.

100개 구간 가운데 93개가 진짜 값 42%를 지나가고, 주황색 7개는 비켜 갔습니다. 이론대로라면 95개 정도가 맞아야 하는데, 100번만 해 보면 이렇게 93이나 97처럼 조금씩 다르게 나옵니다. 시행 횟수를 늘리면 95%에 점점 가까워집니다.

95% 신뢰수준은 "이런 방법으로 구간을 만들면 100번 중 95번 정도는 진짜 값을 포함한다"는 뜻입니다. 우리가 뉴스에서 보는 조사는 이 100개 중 하나이고, 그게 주황색인지 파란색인지는 아무도 모릅니다. 여론조사 결과를 하나의 정답으로 받아들이면 안 되는 이유가 여기 있습니다.

⑥ 몇 명에게 물어야 할까

오차를 줄이려면 더 많이 물으면 됩니다. 그런데 얼마나 많이 물어야 할까요? n을 바꿔 가며 1.96 × √(0.25/n)을 계산했습니다.

조사 인원계산오차범위
30명 (한 반)1.96 × √(0.25/30) = 1.96 × 0.0913±17.9%p
500명1.96 × √(0.25/500) = 1.96 × 0.0224±4.4%p
1,000명1.96 × √(0.25/1000) = 1.96 × 0.0158±3.1%p
2,000명1.96 × √(0.25/2000) = 1.96 × 0.0112±2.2%p
4,000명1.96 × √(0.25/4000) = 1.96 × 0.0079±1.5%p

1,000명에서 4,000명으로 4배를 늘려야 오차범위가 3.1에서 1.5로 절반이 됩니다. n이 근호 안에 있어서 √4 = 2배만큼만 줄어드는 것이죠. 조사 비용은 사람 수에 비례해 늘어나니, 대부분의 여론조사가 1,000명 안팎에서 멈추는 데는 이런 계산이 깔려 있습니다.

반 친구 30명에게 물은 설문으로 "우리 학교 학생의 60%가 찬성"이라고 쓰면 실제로는 42%에서 78% 사이 어디쯤이라는 말과 같습니다. 학교 설문으로 탐구할 때 꼭 함께 적어 두면 좋은 숫자입니다.

그렇다면 모집단의 크기는 상관이 없을까요? 공식에 모집단 크기가 들어 있지 않습니다. 모집단이 표본보다 충분히 크면 서울시장 선거든 대통령 선거든 1,000명에게 물었을 때의 오차범위는 거의 같습니다. 국은 맛을 볼 때 냄비 크기와 상관없이 잘 저어서 한 숟가락만 뜨면 되는 것과 비슷합니다.

⑦ 뉴스 읽기, "오차범위 내 접전"

1,000명 조사에서 후보 A가 42%, 후보 B가 38%라면 A가 이기고 있는 걸까요? 두 후보에 각각 ±3.1%p를 붙여 보면 답이 보입니다.

  • 조사 ①: A는 38.9~45.1%, B는 34.9~41.1%입니다. 38.9~41.1% 구간이 겹치므로 실제로는 B가 앞설 가능성도 있습니다. 이럴 때 뉴스는 "오차범위 내 접전"이라고 씁니다.
  • 조사 ②: A는 42.9~49.1%, B는 30.9~37.1%입니다. 구간이 전혀 겹치지 않으니 A가 앞선다고 말할 수 있습니다.

그러니 지지율 차이가 4%p라는 숫자만 보고 "A 우세"라는 제목을 단 기사는 조심해서 읽어야 합니다. 조사 인원이 몇 명인지, 오차범위가 얼마인지 기사 끝을 확인하는 습관이 필요합니다.

⑧ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "1,000명만 조사한 여론조사를 믿어도 될까?" → 가설: 무작위로 뽑으면 1,000명만으로도 95%의 확률로 실제 값과 3.1%p 이내로 맞는다.
  2. 자료 수집과 계산: 학급 또는 학년 전체에 "급식 만족 여부" 같은 설문을 하고, 그중 10명·30명·50명을 무작위로 여러 번 뽑아 표본비율이 어떻게 흩어지는지 기록한다. 이항분포의 표준편차 √(p(1 − p)/n)으로 계산한 값과 비교한다.
  3. 그래프: 표본 크기별 표본비율의 히스토그램(그림1처럼)과, 표본마다 만든 구간을 세로로 늘어놓은 그래프(그림3처럼)를 그린다. 엑셀이나 파이썬으로 100번 반복하면 실제로 몇 개가 전체 비율을 포함하는지 셀 수 있다.
  4. 결론과 한계: "30명 표본의 오차범위는 ±17.9%p로, 학급 설문만으로 학교 전체를 말하기 어렵다"처럼 수치로 결론을 쓴다. 한계로는 응답을 거절한 사람이 많으면 무작위가 깨진다는 점, 두 후보의 차이에 대한 오차범위는 각자의 오차범위와 따로 계산해야 한다는 점(42% 대 38%라면 차이 4%p의 오차범위는 약 ±5.5%p)을 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • 신뢰수준을 99%로 높이면 1.96 대신 2.58을 쓴다. 같은 1,000명이면 오차범위는 얼마가 될까?
  • 오차범위를 ±1%p로 줄이려면 몇 명에게 물어야 할까? (1.96 × √(0.25/n) = 0.01을 n에 대해 풀어 보기)
  • 지난 선거의 마지막 여론조사와 실제 득표율을 비교하면 오차범위 안에 들어왔을까?

함께 읽으면 좋은 시리즈 글

다음 글 예고: 로또 1등 확률은 정말 814만분의 1일까요? 1,000원짜리 로또 한 장의 기댓값은 얼마일까요? 다음 시리즈에서는 조합과 기댓값으로 로또를 끝까지 계산해 봅니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

세특 탐구 주제 시리즈 #8 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 확률과 통계의 조합, 확률, 이산확률변수의 기댓값입니다.

로또 1등 확률이 814만분의 1이라는 말은 많이 들어 봤을 겁니다. 그런데 그 숫자를 직접 계산해 본 적이 있나요? 그리고 1,000원을 내고 산 로또 한 장은 평균적으로 얼마의 값어치가 있을까요? 경품 이벤트의 당첨 확률과 비용을 정하는 마케터도, 자료를 분석하는 통계 전문가도 이런 "확률 × 금액"의 계산을 매일 합니다. 이번 글에서는 로또 한 장을 처음부터 끝까지 숫자로 따져 보겠습니다. (복권은 만 19세 이상만 살 수 있습니다. 이 글은 계산만 합니다.)

주요단어: 로또 확률, 로또 기댓값, 조합, 복권 당첨금, 확률변수, 기댓값, 마케팅, 확률과 통계, 고등학교, 주제탐구

① 먼저 알아 둘 것, 로또의 규칙

로또 6/45는 1부터 45까지의 수 중에서 6개를 고르는 복권입니다. 추첨에서는 당첨 번호 6개와 보너스 번호 1개를 뽑고, 내가 고른 6개가 몇 개 맞았는지로 등수가 정해집니다.

등수조건당첨금
1등6개 모두 일치당첨금 총액에서 4·5등 몫을 뺀 나머지를
75% : 12.5% : 12.5%로 나눔
2등5개 일치 + 보너스 번호 일치
3등5개 일치
4등4개 일치50,000원 (고정)
5등3개 일치5,000원 (고정)

판매한 돈 가운데 당첨금으로 돌아가는 비율은 50%로 정해져 있습니다(동행복권 안내 기준). 나머지는 복권기금, 판매점 수수료, 운영비로 쓰입니다. 이 규칙 두 줄이 뒤에서 기댓값을 계산할 때 그대로 쓰입니다.

② 작은 로또로 먼저 연습하기

45개 중 6개는 너무 크니, 1부터 5까지의 수 중 2개를 고르는 "미니 로또"부터 해 봅시다. 고를 수 있는 경우를 모두 적으면 이렇습니다.

{1,2} {1,3} {1,4} {1,5} {2,3} {2,4} {2,5} {3,4} {3,5} {4,5}

모두 10가지이고, 이것은 5C2 = (5 × 4) ÷ (2 × 1) = 10과 같습니다. 당첨 번호가 {1,2}라고 하면 내가 고른 2개 중 몇 개가 맞는지에 따라 이렇게 나뉩니다.

  • 2개 다 맞음: 당첨 번호 2개 중 2개를 고르는 경우 2C2 = 1가지 ({1,2})
  • 1개만 맞음: 당첨 번호 중 1개, 나머지 3개 중 1개 → 2C1 × 3C1 = 2 × 3 = 6가지
  • 하나도 안 맞음: 나머지 3개 중 2개 → 3C2 = 3가지

1 + 6 + 3 = 10으로 전체와 딱 맞습니다. "당첨 번호에서 몇 개, 나머지 번호에서 몇 개를 고르는가"로 나눠 곱하는 이 방법을 진짜 로또에도 그대로 씁니다.

③ 진짜 로또의 경우의 수 8,145,060

45개 중 6개를 고르는 경우의 수는 45C6입니다. 분자를 차례로 곱해 보겠습니다.

  • 45 × 44 = 1,980
  • 1,980 × 43 = 85,140
  • 85,140 × 42 = 3,575,880
  • 3,575,880 × 41 = 146,611,080
  • 146,611,080 × 40 = 5,864,443,200

고른 6개의 순서는 상관없으므로 6! = 720으로 나눕니다.

5,864,443,200 ÷ 720 = 8,145,060

1등 확률은 1/8,145,060입니다. 매주 한 게임씩 산다면 평균적으로 8,145,060주, 1년을 52주로 계산하면 약 156,636년을 기다려야 1등이 한 번 나옵니다. 지금부터 사도 구석기 시대부터 샀어야 할 시간이 걸리는 셈이죠.

④ 2등부터 5등까지 직접 세기

②의 방법대로 "당첨 번호 6개에서 몇 개, 나머지 39개에서 몇 개"로 나눕니다. 2등과 3등은 보너스 번호 때문에 조금 조심해야 합니다.

등수경우의 수 계산경우의 수약 몇 게임에 1번
1등6C6 = 118,145,060
2등6C5 × 1 (보너스 번호) = 6 × 161,357,510
3등6C5 × 38 (보너스를 뺀 38개 중 1개)22835,724
4등6C4 × 39C2 = 15 × 74111,115733
5등6C3 × 39C3 = 20 × 9,139182,78045

중간 계산도 확인해 둡니다. 39C2 = (39 × 38) ÷ 2 = 741이고, 39C3 = (39 × 38 × 37) ÷ 6 = 54,834 ÷ 6 = 9,139입니다. 3등에서 38을 곱하는 이유는, 남은 한 자리에 보너스 번호가 오면 2등이 되기 때문입니다. 여기서 많이들 39를 곱하는 실수를 합니다.

당첨되는 경우를 모두 더하면 1 + 6 + 228 + 11,115 + 182,780 = 194,130가지입니다. 전체의 194,130 ÷ 8,145,060 ≈ 2.38%, 약 42게임에 한 번은 5등 이상이 나옵니다. 나머지 7,950,930가지(97.6%)는 꽝입니다.

세로축이 한 칸 올라갈 때마다 10배씩 커지는 로그 눈금입니다. 보통 눈금으로 그리면 1등부터 3등까지는 막대가 보이지도 않습니다.

⑤ 1,000원짜리 로또 한 장의 기댓값

로또 한 장으로 받는 돈을 확률변수 X라고 하면, 기댓값은 "각 등수의 당첨금 × 그 등수의 확률"을 모두 더한 값입니다. 금액이 고정된 4등과 5등부터 계산합니다.

  • 4등: 50,000 × 11,115/8,145,060 ≈ 68.23원
  • 5등: 5,000 × 182,780/8,145,060 ≈ 112.20원
  • 4·5등 합: 180.43원

①에서 당첨금 총액은 판매액의 50%라고 했으니, 한 게임당 당첨금으로 돌아가는 돈은 평균 500원입니다. 여기서 4·5등 몫을 빼면 1~3등 몫이 나옵니다.

  • 1~3등 몫: 500 − 180.43 = 319.57원
  • 1등: 319.57 × 0.75 ≈ 239.67원
  • 2등: 319.57 × 0.125 ≈ 39.95원
  • 3등: 319.57 × 0.125 ≈ 39.95원

여기서 재미있는 계산이 하나 나옵니다. 1등 몫이 한 게임당 239.67원이고 1등 확률이 1/8,145,060이므로, 1등 한 사람이 받는 돈의 기댓값은

239.67 × 8,145,060 ≈ 19억 5,216만 원

입니다. 판매량이 늘면 1등 몫도 늘지만 1등 당첨자 수도 같은 비율로 늘기 때문에, 판매량과 상관없이 1인당 약 19.5억 원 근처가 됩니다. 예를 들어 한 회차에 1억 1,500만 게임이 팔렸다면 1등은 평균 1억 1,500만 ÷ 8,145,060 ≈ 14.1명 나옵니다. 최근 회차 기사를 찾아보면 1등이 대체로 12~16명, 1인당 18억~26억 원 정도로 이 계산과 잘 맞습니다.

같은 방법으로 2등 1인 당첨금은 39.95 × 8,145,060 ÷ 6 ≈ 5,423만 원, 3등은 39.95 × 8,145,060 ÷ 228 ≈ 143만 원입니다.

⑥ 세금까지 빼면

복권 당첨금은 200만 원을 넘으면 세금을 냅니다. 3억 원까지는 22%, 3억 원을 넘는 부분은 33%입니다. 1등 19억 5,216만 원으로 직접 계산해 봅시다.

  • 3억 원까지의 세금: 3억 × 0.22 = 6,600만 원
  • 3억 원을 넘는 부분: 19억 5,216만 − 3억 = 16억 5,216만 원, 세금은 × 0.33 ≈ 5억 4,521만 원
  • 세금 합계: 약 6억 1,121만 원, 실제로 받는 돈은 약 13억 4,095만 원

2등 5,423만 원은 22%를 떼면 약 4,230만 원이 되고, 3등 143만 원과 4·5등은 200만 원 이하라 세금이 없습니다. 세금을 뺀 기댓값을 다시 더하면 이렇습니다.

등수세후 당첨금 × 확률기댓값
1등13억 4,095만 × 1/8,145,060164.63원
2등4,230만 × 6/8,145,06031.16원
3등143만 × 228/8,145,06039.95원
4등5만 × 11,115/8,145,06068.23원
5등5,000 × 182,780/8,145,060112.20원
합계약 416원

1,000원을 내고 평균 416원을 돌려받는 셈입니다. 한 게임을 살 때마다 평균 584원을 잃는다는 뜻이기도 합니다.

잃은 584원은 어디로 갈까?
584원을 나눠 보면 이렇습니다. 판매액의 43.6%인 436원은 복권기금, 54원은 판매점 수수료, 10원은 운영비로 갑니다(동행복권 안내 기준). 나머지 84원은 1·2등 당첨자가 낸 세금입니다. 436 + 54 + 10 + 84 = 584원으로 딱 맞습니다.
이 가운데 복권기금은 정부 복권위원회가 관리하며 우리 사회로 돌아옵니다. 임대주택 건설 같은 저소득층 주거 지원, 장애인과 소외계층 복지, 저소득층 학생을 대학까지 지원하는 꿈사다리 장학금, 기초생활수급자가 공연·여행·체육활동에 쓰는 문화누리카드 같은 사업에 쓰입니다. 2027년에 이런 공익사업에 쓰일 복권 재원은 약 3조 4,000억 원으로 전망됩니다.
산 사람 한 명에게는 손해인 기댓값이지만, 그 차이의 상당 부분은 사회 전체로 돌아가는 셈입니다. 그래서 복권을 "스스로 원해서 내는 기부금"으로 보는 시각도 있습니다.

⑦ 기댓값대로 잃지도 않는다

기댓값이 416원(세전 500원)이라고 해서 실제로 매번 그만큼 돌려받는 것은 아닙니다. 매주 5게임씩 10년 동안, 모두 2,600게임(260만 원어치)을 산 사람 5명을 컴퓨터로 시뮬레이션했습니다.

세전 기댓값대로라면 2,600 × 500 = 130만 원을 잃어야 하는데, 5명 모두 205만~220만 원을 잃었습니다. 계단처럼 튀어 오른 곳은 4등(5만 원)에 당첨된 순간입니다. 왜 기댓값보다 더 많이 잃었을까요?

기댓값 500원 가운데 320원은 1~3등에서 나옵니다. 그런데 10년 동안 1~3등에 한 번이라도 걸릴 확률은 2,600 × (235/8,145,060) ≈ 7.5%에 불과합니다. 대부분의 사람은 4·5등 몫 180원만 받으니 실제로는 1게임당 약 820원을 잃게 됩니다. 기댓값은 "모든 사람의 평균"이고, 그 평균은 아주 드문 당첨자 몇 명이 끌어올린 값입니다.

50년 동안 매주 5게임(13,000게임)을 사도 1등에 한 번이라도 될 확률은 1 − (1 − 1/8,145,060)13000 ≈ 0.16%입니다. 그동안 기댓값만으로도 650만 원을 잃습니다.

하나 덧붙이면, 1, 2, 3, 4, 5, 6처럼 "말도 안 되는" 번호도 1등 확률은 다른 조합과 똑같이 1/8,145,060입니다. 다만 이런 번호를 고르는 사람이 의외로 많아서, 당첨되면 여러 명이 나눠 가져 1인당 금액이 줄어듭니다. 확률은 같아도 기댓값은 달라질 수 있다는 점이 흥미로운 탐구거리입니다.

⑧ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "1,000원짜리 로또 한 장의 수학적 가치는 얼마일까?" → 가설: 당첨금 지급률이 50%이므로 기댓값은 500원이고, 세금을 빼면 더 낮다.
  2. 자료 수집과 계산: 조합으로 등수별 경우의 수를 구하고, 동행복권 홈페이지에서 최근 회차의 판매액과 등수별 당첨자 수·당첨금을 모은다. 실제 자료로 회차마다 기댓값을 계산해 500원과 비교한다.
  3. 그래프: 등수별 경우의 수(그림1), 1,000원의 분배(그림2), 엑셀의 RAND 함수나 파이썬으로 만든 누적 손익 시뮬레이션(그림3)을 그린다.
  4. 결론과 한계: "세후 기댓값은 약 416원이고, 1~3등에 걸리지 않는 대부분의 사람은 1게임당 약 820원을 잃는다"처럼 수치로 결론을 쓴다. 한계로는 1~3등 당첨금이 회차마다 달라 평균값을 썼다는 점, 이월이나 많은 사람이 고르는 번호 같은 요인을 넣지 않았다는 점을 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • 연금복권이나 즉석복권의 기댓값은 로또보다 높을까 낮을까?
  • 복권위원회 자료에서 복권기금이 어떤 사업에 얼마씩 쓰였는지 찾아 그래프로 그리고, 복권이 사회에 주는 이익과 손해를 함께 따져 보기.
  • 편의점 경품 이벤트를 직접 설계해 보기. 1등 확률과 상품 가격을 정하고, 회사가 손님 한 명당 쓰는 기대 비용을 계산해 보기.
  • 번호 45개가 지금까지 나온 횟수를 세면 정말 고르게 나왔을까? (카이제곱 검정은 대학 통계지만, 막대그래프로 비교하는 것만으로도 좋은 탐구가 된다)

함께 읽으면 좋은 시리즈 글

다음 글 예고: 책 뒤에 있는 13자리 ISBN 바코드는 숫자 하나가 틀리면 어떻게 알아챌까요? 다음 시리즈에서는 정수의 나머지로 바코드의 검증 숫자를 직접 계산해 봅니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

세특 탐구 주제 시리즈 #6 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 대수의 수열의 귀납적 정의입니다.

토끼 한 쌍이 해마다 새끼를 낳아 수가 1.5배씩 늘어난다면, 몇십 년 뒤에는 지구가 토끼로 덮이겠죠. 하지만 실제로는 그런 일이 일어나지 않습니다. 먹이와 공간이 한정되어 있기 때문입니다. 이번 글에서는 연못에 사는 붕어의 수를 한 해씩 직접 계산하면서, 생물의 수가 늘다가 멈추는 로지스틱 성장을 고등학교 수열로 설명해 보겠습니다.

주요단어: 로지스틱 성장, 환경수용력, 개체수 증가, 수열의 귀납적 정의, 등비수열, S자 곡선, 생활 속 수학, 대수, 고등학교, 주제탐구

① 전제조건: 자원은 한정되어 있다

출발점은 단순합니다. 먹이와 공간에는 한계가 있습니다. 한 연못이 먹여 살릴 수 있는 붕어의 수에는 최대치가 있고, 이를 환경수용력이라고 합니다. 이 글에서는 다음 조건으로 계산합니다.

  • 처음 붕어 수: 100마리
  • 환경수용력: 1,000마리
  • 자원이 넉넉할 때의 1년 성장률: 50% (r = 0.5)

② 시작하기 전에: 수열의 귀납적 정의

이 글의 계산은 "앞의 값으로 다음 값을 정하는" 방식으로 진행됩니다. 고등학교 대수에서 배우는 수열의 귀납적 정의를 간단한 예로 먼저 정리해 두겠습니다.

수열의 귀납적 정의: 다음 값을 만드는 규칙

수열을 "첫째항"과 "앞의 항으로 다음 항을 만드는 규칙"으로 정하는 방법입니다.

a1 = 1,   an+1 = an + 2

첫째항이 1이고, 다음 항은 앞의 항에 2를 더해서 만듭니다. 그러면 a2 = 1 + 2 = 3, a3 = 3 + 2 = 5, a4 = 5 + 2 = 7 … 처럼 홀수 1, 3, 5, 7, … 이 차례로 나옵니다. 이 글의 붕어 수 계산도 바로 이 방식입니다.

정리하면 귀납적 정의는 "첫째항 + 다음 항을 만드는 규칙"만 있으면 수열 전체를 하나씩 차례로 만들어 낼 수 있는 방법입니다. 이 글에서는 이 방법으로 붕어 수를 한 해씩 계산합니다.

③ 자원이 무한하다면: 등비수열

먼저 전제조건을 무시하고, 붕어가 해마다 50%씩 늘어난다고 해 봅시다. 해마다 1.5를 곱하므로 공비 1.5인 등비수열입니다.

1년 뒤: 100 × 1.5 = 150마리
2년 뒤: 150 × 1.5 = 225마리
3년 뒤: 225 × 1.5 = 337.5마리
n년 뒤: 100 × 1.5n 마리

이대로라면 6년 뒤 약 1,139마리로 환경수용력을 넘고, 10년 뒤에는 100 × 1.510 ≈ 5,767마리가 됩니다. 1,000마리밖에 살 수 없는 연못에서는 불가능한 숫자입니다.

④ 빈자리만큼만 늘어난다: 로지스틱 성장의 식

현실에서는 연못이 붐빌수록 먹이가 부족해 덜 늘어납니다. 이를 "빈자리 비율"로 나타내 봅시다.

  • 붕어가 100마리면 1,000마리 중 100마리가 찼으므로 빈자리 비율은 1 − 100/1000 = 0.9
  • 붕어가 500마리면 빈자리 비율은 1 − 500/1000 = 0.5
  • 붕어가 1,000마리면 빈자리 비율은 0, 더 늘어날 수 없음

그래서 한 해 동안 늘어나는 수를 "원래 성장 × 빈자리 비율"로 정합니다. n년 뒤 붕어 수를 an이라 하면

a0 = 100,   an+1 = an + 0.5 × an × (1 − an ÷ 1000)

처음 보면 복잡해 보이지만, 식을 세 조각으로 나누어 읽으면 어렵지 않습니다.

식의 조각 뜻 붕어 100마리일 때
an 올해 붕어 수 100
0.5 × an 자원이 넉넉할 때 늘어날 수 (50%) 0.5 × 100 = 50
(1 − an ÷ 1000) 빈자리 비율 (연못이 얼마나 비어 있는가) 1 − 0.1 = 0.9
0.5 × an × (1 − an ÷ 1000) 실제로 늘어나는 수 50 × 0.9 = 45
an+1 내년 붕어 수 = 올해 + 늘어난 수 100 + 45 = 145

즉 이 식은 "내년 수 = 올해 수 + (넉넉할 때 늘어날 수) × (빈자리 비율)"을 기호로 쓴 것입니다. 빈자리 비율이 일종의 "브레이크" 역할을 합니다.

이 브레이크가 어떻게 작동하는지 몇 가지 경우로 확인해 봅시다.

  • 브레이크가 없다면: 빈자리 비율을 빼면 an+1 = an + 0.5 × an = 1.5 × an 이 됩니다. 이것이 바로 ③의 공비 1.5인 등비수열입니다. 로지스틱 성장은 등비수열에 브레이크를 단 것이라고 할 수 있습니다.
  • 붕어가 적을 때 (100마리): 빈자리 비율 0.9로 브레이크가 거의 걸리지 않아, 45마리가 늘어납니다. 브레이크가 없을 때(50마리)와 거의 같습니다.
  • 붕어가 꽉 찼을 때 (1,000마리): 빈자리 비율이 1 − 1000 ÷ 1000 = 0 이므로 늘어나는 수는 0.5 × 1000 × 0 = 0. 내년에도 1,000마리 그대로입니다.
  • 붕어가 너무 많을 때 (1,100마리): 빈자리 비율이 1 − 1100 ÷ 1000 = −0.1 로 음수가 됩니다. 늘어나는 수는 0.5 × 1100 × (−0.1) = −55 이므로 내년에는 1,100 − 55 = 1,045마리로 줄어듭니다. 먹이가 모자라 일부가 살아남지 못하는 상황을 식이 스스로 표현합니다.

이 글의 숫자 0.5와 1000을 일반적인 문자로 바꾸면, 성장률 r과 환경수용력 K에 대한 식이 됩니다.

an+1 = an + r × an × (1 − an ÷ K)

이렇게 다음 해의 값을 이전 해의 값으로 정하는 방식이 바로 고등학교 대수에서 배우는 수열의 귀납적 정의입니다. 첫째항 a0 = 100만 주어지면 a1, a2, a3, … 을 차례로 모두 구할 수 있습니다.

⑤ 한 해씩 직접 계산하기

  1. 1년 뒤: 늘어나는 수 = 0.5 × 100 × (1 − 0.1) = 0.5 × 100 × 0.9 = 45 → a1 = 100 + 45 = 145마리
  2. 2년 뒤: 빈자리 비율 1 − 0.145 = 0.855, 늘어나는 수 = 0.5 × 145 × 0.855 ≈ 62.0 → a2 ≈ 207.0마리
  3. 3년 뒤: 빈자리 비율 1 − 0.207 = 0.793, 늘어나는 수 = 0.5 × 207.0 × 0.793 ≈ 82.1 → a3 ≈ 289.1마리

같은 계산을 이어 가면 다음과 같습니다. (소수 첫째 자리까지)

지난 해 등비수열(1.5배) 로지스틱 성장 그해 늘어난 수
0 100 100 -
1 150 145.0 45.0
2 225 207.0 62.0
3 337.5 289.1 82.1
4 506.2 391.8 102.8
5 759.4 511.0 119.1
6 1,139.1 635.9 124.9
7 1,708.6 751.7 115.8
8 2,562.9 845.0 93.3
10 5,766.5 951.2 40.8
12 12,974.6 986.9 12.5

처음 2~3년은 두 수열이 거의 비슷합니다. 붕어가 적을 때는 빈자리 비율이 1에 가까워 사실상 1.5배씩 늘기 때문입니다. 하지만 붕어가 많아질수록 차이가 벌어지고, 로지스틱 성장은 1,000마리에 점점 가까이 다가가며 거의 멈춥니다. 그래프가 영어 S자처럼 생겨서 S자 곡선이라고도 부릅니다.

⑥ 언제 가장 많이 늘어날까? 정답은 절반인 500마리

표의 "그해 늘어난 수"를 보면 45 → 62 → 82 → 103 → 119 → 125 → 116 → 93 … 으로, 늘어난 수가 커졌다가 다시 작아집니다. 가장 많이 늘어난 해는 시작 수가 약 511마리였던 해입니다.

왜 그럴까요? 붕어가 x마리일 때 한 해에 늘어나는 수는 0.5 × x × (1 − x ÷ 1000) 입니다. 몇 가지 값을 넣어 봅시다.

붕어 수 x 계산 한 해에 늘어나는 수
100 0.5 × 100 × 0.9 45
300 0.5 × 300 × 0.7 105
500 0.5 × 500 × 0.5 125
700 0.5 × 700 × 0.3 105
900 0.5 × 900 × 0.1 45

100과 900, 300과 700에서 늘어나는 수가 똑같습니다. 이 값은 x에 대한 이차식 0.5x − 0.0005x2 이고, 그래프가 x = 500을 축으로 하는 위로 볼록한 포물선이기 때문입니다. 붕어가 적으면 새끼를 낳을 어미가 적고, 너무 많으면 빈자리가 적어서 덜 늘어납니다. 그 균형이 가장 좋은 지점이 환경수용력의 절반입니다.

이 사실은 실제로도 쓰입니다. 물고기를 잡는 어업에서는 물고기 수를 환경수용력의 절반 정도로 유지하면 해마다 가장 많이 잡으면서도 개체 수를 지킬 수 있다는 생각을 바탕으로 잡는 양을 정하기도 합니다.

⑦ 성장률이 크면 이상한 일이 생긴다

성장률 r을 0.5보다 크게 바꿔 같은 식으로 계산하면 놀라운 결과가 나옵니다.

  • r = 1.8: 1년 뒤 100 + 1.8 × 100 × 0.9 = 262, 2년 뒤 262 + 1.8 × 262 × 0.738 ≈ 610.0, 3년 뒤 610 + 1.8 × 610 × 0.39 ≈ 1,038.2. 환경수용력을 넘었다가 다시 줄었다 늘었다 하면서 1,000에 자리 잡습니다.
  • r = 2.3: 몇 년 뒤부터 약 688마리와 1,182마리를 해마다 번갈아 오갑니다. 1,182마리인 해는 너무 붐벼서 다음 해에 크게 줄고, 688마리인 해는 여유가 있어 다시 크게 늡니다.
  • r = 2.8: 250, 775, 1,263, 333, 955 … 처럼 규칙을 찾기 어려울 만큼 요동칩니다. 이렇게 단순한 식에서 예측하기 어려운 움직임이 나오는 현상을 혼돈(카오스)이라고 합니다.

식은 하나인데 r 값 하나에 따라 "부드럽게 멈춤 → 출렁이며 멈춤 → 두 값 반복 → 혼돈"으로 성격이 완전히 바뀝니다. 직접 계산해 보면 수열의 귀납적 정의가 얼마나 다양한 모습을 만들 수 있는지 느낄 수 있습니다.

⑧ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "생물의 수는 왜 등비수열처럼 끝없이 늘지 않을까?" → 가설: 환경수용력이 있으면 늘어나는 속도가 줄어 일정한 수에 가까워진다.
  2. 자료 수집과 계산: 처음 수, 성장률, 환경수용력을 정하고 an+1 = an + r·an(1 − an/K)을 엑셀에 입력해 20년치를 계산한다. 생명과학 시간에 효모나 콩나물 기르기 같은 간단한 관찰 자료가 있다면 실제 값과 비교해도 좋다.
  3. 그래프: 등비수열과 로지스틱 성장을 한 그래프에 그리고, 해마다 늘어난 수를 막대그래프로 그려 최대가 되는 지점을 찾는다.
  4. 결론과 한계: "환경수용력의 절반에서 가장 많이 늘어난다"처럼 수치로 결론을 쓴다. 한계로는 실제 환경수용력은 계절이나 먹이에 따라 바뀐다는 점, 천적이나 질병 같은 다른 요인이 빠졌다는 점을 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • 해마다 50마리씩 잡아낸다면 붕어 수는 어디에 자리 잡을까? 100마리씩이면?
  • r을 0.1씩 바꿔 가며 계산할 때, 두 값을 번갈아 오가기 시작하는 r은 얼마쯤일까?
  • 신제품 보급률이나 감염병 누적 환자 수도 S자 곡선을 그릴까?

함께 읽으면 좋은 시리즈 글

다음 글 예고: 뉴스에서 자주 보는 "오차범위 ±3.1%p"는 어떻게 계산할까요? 다음 시리즈에서는 확률과 통계로 여론조사 오차범위를 직접 계산해 봅니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

세특 탐구 주제 시리즈 #5 · 고등학교 수학으로 생활 속 궁금증을 직접 계산해 보는 시리즈입니다. 이번 주제는 대수의 등비수열의 합과 지수·로그입니다.

약 봉투에 적힌 "하루 2번, 12시간 간격"이라는 말은 누가, 어떻게 정했을까요? 약효를 오래 유지하려면 더 자주 먹는 게 좋을 것 같지만, 그러면 몸속 약이 너무 많아질 수도 있습니다. 이번 글에서는 가상의 약 하나를 정해 놓고, 몸속 약의 양을 한 번 먹을 때마다 직접 계산해 보겠습니다. 계산에 필요한 것은 등비수열의 합과 상용로그뿐입니다.

주요단어: 약 복용 간격, 반감기, 약동학, 카페인, 등비수열의 합, 지수함수, 상용로그, 생활 속 수학, 대수, 고등학교, 주제탐구

① 먼저 알아 둘 것: 약은 일정한 시간마다 절반이 된다

계산을 시작하기 전에 알아 둘 사실이 하나 있습니다. 몸은 약을 일정한 비율로 없앱니다. 많은 약은 몸속에 남은 양이 일정한 시간마다 절반으로 줄어듭니다. 이 시간을 반감기라고 합니다. 탄소 연대 측정에서 탄소-14가 5,730년마다 절반이 되던 것과 같은 원리입니다.

몸은 먹은 약을 여러 길로 없앱니다.

  • 간에서 분해(대사): 대부분의 약은 간에서 다른 물질로 바뀌어 약효를 잃습니다.
  • 콩팥을 거쳐 소변으로: 피 속의 약과 분해된 물질이 콩팥에서 걸러져 소변으로 나갑니다. 가장 큰 배출 통로입니다.
  • 쓸개즙을 거쳐 대변으로: 간에서 만든 쓸개즙에 섞여 장으로 나간 뒤, 소화 과정의 찌꺼기와 함께 대변으로 빠져나갑니다.
  • 땀, 숨, 침: 아주 적은 양이지만 땀이나 내쉬는 숨, 침으로도 나갑니다.

이 통로들은 몸속에 약이 많을수록 그만큼 많이 내보냅니다. 400mg이 있을 때는 한 시간에 없애는 양이 많고, 100mg이 있을 때는 적습니다. 매번 "남은 양의 일정한 비율"만큼 줄어들기 때문에, 몇 mg이 있든 같은 시간이 지나면 절반이 됩니다.

이 글에서는 다음과 같은 가상의 약 A로 계산합니다. (실제 약의 수치는 약마다 다르니, 복용은 반드시 의사·약사의 안내를 따르세요.)

  • 한 번에 먹는 양: 400mg
  • 반감기: 6시간 (6시간마다 몸속 양이 절반)
  • 효과가 나려면 몸속에 100mg 이상 있어야 함
  • 약 복용 간격 몸속 양이 700mg을 넘으면 부작용 위험

② 한 번만 먹으면: 지수함수로 줄어든다

400mg을 먹고 시간이 지나면 몸속 양은 이렇게 줄어듭니다.

먹은 뒤 지난 시간 계산 몸속 약의 양
0시간 400 400mg
6시간 400 × 1/2 200mg
12시간 400 × (1/2)2 100mg
18시간 400 × (1/2)3 50mg
24시간 400 × (1/2)4 25mg

t시간이 지나면 6시간이 t ÷ 6 번 지난 것이므로, 몸속 양은 400 × (1/2)t ÷ 6 mg입니다. 한 번만 먹으면 12시간 뒤에 딱 100mg이 되어, 그때부터는 효과가 없습니다. 그래서 효과를 이어 가려면 다시 먹어야 합니다.

생활 속 실제 예: 오후 3시에 마신 커피는 밤 11시에 얼마나 남아 있을까?
반감기는 약에만 있는 것이 아닙니다. 커피의 카페인도 몸속에서 일정한 시간마다 절반으로 줄어드는데, 성인의 카페인 반감기는 보통 약 5시간(사람에 따라 3~7시간)으로 알려져 있습니다. 아메리카노 한 잔에 카페인이 약 150mg 들어 있다고 하고 계산해 봅시다.
① 오후 3시부터 밤 11시까지는 8시간이므로, 반감기 5시간이 8 ÷ 5 = 1.6번 지납니다.
② 남은 양 = 150 × (1/2)1.6 = 150 ÷ 21.6
③ 21.6을 상용로그로 구하면 log 21.6 = 1.6 × 0.3010 = 0.4816 이고, 100.4816 ≈ 3.03 이므로 21.6 ≈ 3.03
④ 남은 양 ≈ 150 ÷ 3.03 ≈ 49.5mg
잠자리에 들 때도 처음 마신 양의 약 1/3, 커피 3분의 1잔 정도가 몸속에 남아 있는 셈입니다. 오후 늦게 마신 커피가 잠을 방해하는 이유를 숫자로 확인할 수 있습니다.

③ 12시간마다 먹으면: 한 번씩 직접 계산하기

12시간은 반감기 6시간이 두 번 지나는 시간입니다. 그러니 12시간 뒤에는 남아 있던 양이 (1/2) × (1/2) = 1/4이 됩니다. 이 점만 기억하고 한 번씩 따라가 봅시다.

  1. 1번째 복용 직후: 400mg
  2. 2번째 복용 직후 (12시간): 남은 양 400 × 1/4 = 100mg, 여기에 새로 400mg → 100 + 400 = 500mg
  3. 3번째 복용 직후 (24시간): 500 × 1/4 = 125mg 남음 → 125 + 400 = 525mg
  4. 4번째 복용 직후 (36시간): 525 × 1/4 = 131.25mg 남음 → 131.25 + 400 = 531.25mg
  5. 5번째 복용 직후 (48시간): 531.25 × 1/4 ≈ 132.81mg 남음 → 532.81mg

늘어나는 양이 100 → 25 → 6.25 → 1.56 으로 점점 작아집니다. 몸속 약은 계속 쌓이기만 하는 것이 아니라, 어떤 값 근처에서 거의 멈춥니다.

④ 등비수열의 합으로 정리하기

3번째 복용 직후의 525mg을 다시 뜯어보면, 몸속에는 세 번 먹은 약이 섞여 있습니다.

  • 방금 먹은 약: 400mg
  • 12시간 전에 먹은 약: 400 × 1/4 = 100mg
  • 24시간 전에 먹은 약: 400 × (1/4)2 = 25mg

더하면 400 + 100 + 25 = 525mg으로 위의 계산과 같습니다. 그러니 n번째 복용 직후의 양 Sn은 첫째항 400, 공비 1/4인 등비수열의 합입니다.

Sn = 400 + 400 × (1/4) + 400 × (1/4)2 + … + 400 × (1/4)n−1

등비수열의 합 공식 S = a(1 − rn) ÷ (1 − r) 에 a = 400, r = 1/4 을 넣어 한 단계씩 정리합니다.

  1. 분모: 1 − 1/4 = 3/4
  2. Sn = 400 × {1 − (1/4)n} ÷ (3/4) = 400 × 4/3 × {1 − (1/4)n}
  3. 400 × 4/3 = 1600/3 ≈ 533.33 이므로   Sn = 533.33 × {1 − (1/4)n}

숫자로 확인해 봅시다. n = 3 이면 (1/4)3 = 1/64 = 0.015625 이므로 533.33 × (1 − 0.015625) = 533.33 × 0.984375 ≈ 525mg. ③에서 한 번씩 더한 값과 정확히 같습니다.

이 식에서 중요한 사실이 하나 보입니다. (1/4)n은 아무리 n이 커져도 0보다 큰 양수이므로, 1 − (1/4)n은 항상 1보다 작습니다. 따라서 몇 번을 먹어도 몸속 양은 533.33mg을 넘지 못합니다. 8번째에는 533.33 × (1 − 1/65,536) ≈ 533.32mg으로, 그 선에 거의 붙어 있습니다.

다음 복용 직전(가장 적을 때)의 양은 이 값의 1/4이므로 533.33 × 1/4 ≈ 133.33mg입니다. 즉 12시간 간격으로 먹으면 몸속 약은 약 133mg ~ 533mg 사이를 오가고, 이는 효과 기준 100mg과 위험 기준 700mg 사이에 쏙 들어갑니다.

⑤ 간격을 바꾸면? 6시간·12시간·24시간 비교

같은 방법으로 간격만 바꿔 봅시다. 바뀌는 것은 공비뿐입니다.

  • 6시간 간격: 반감기 1번 → 공비 1/2. Sn = 400 × {1 − (1/2)n} ÷ (1/2) = 800 × {1 − (1/2)n}
    → 400, 600, 700, 750, 775, … 4번째 복용(18시간)부터 위험 기준 700mg을 넘습니다.
  • 12시간 간격: 공비 1/4 → 최대 533.33mg, 최소 133.33mg (④에서 계산)
  • 24시간 간격: 반감기 4번 → 공비 (1/2)4 = 1/16. Sn = 400 × {1 − (1/16)n} ÷ (15/16) ≈ 426.67 × {1 − (1/16)n}
    → 최대 약 426.67mg, 다음 복용 직전에는 426.67 × 1/16 ≈ 26.67mg까지 떨어집니다.
복용 간격 공비 최대(먹은 직후) 최소(먹기 직전) 판정
6시간 1/2 약 800mg 약 400mg 위험 기준 초과
12시간 1/4 약 533mg 약 133mg 안전하고 효과 유지
24시간 1/16 약 427mg 약 27mg 효과 없는 시간이 김

⑥ 로그로 계산하기: 24시간 간격이면 몇 시간 동안 효과가 있을까?

24시간 간격에서 먹은 직후 양은 약 426.67mg입니다. 이 양이 100mg까지 떨어지는 시간 t를 구해 봅시다.

  1. 식 세우기: 426.67 × (1/2)t ÷ 6 = 100
  2. 정리하기: 양변을 426.67로 나누면 (1/2)t ÷ 6 = 100 ÷ 426.67, 즉 2t ÷ 6 = 426.67 ÷ 100 = 4.2667
  3. 양변에 상용로그: (t ÷ 6) × log 2 = log 4.2667
  4. 로그 값 구하기: 4.2667 = 64/15 이므로 log 4.2667 = log 64 − log 15 = 6 log 2 − (log 3 + log 5) = 1.8062 − (0.4771 + 0.6990) = 0.6301
  5. t 구하기: t ÷ 6 = 0.6301 ÷ 0.3010 ≈ 2.093 이므로 t ≈ 6 × 2.093 ≈ 12.6시간

확인: 426.67 × (1/2)2.093 = 426.67 ÷ 22.093 ≈ 426.67 ÷ 4.267 ≈ 100mg. 맞습니다. 결국 24시간 간격으로 먹으면 하루 24시간 가운데 약 12.6시간만 효과가 있고, 나머지 11.4시간은 효과가 없습니다.

같은 방법으로 12시간 간격으로 먹다가 마지막 약을 먹은 뒤(533.33mg) 100mg 아래로 내려가는 시간을 구하면, 2t ÷ 6 = 5.333, log 5.333 = log 16 − log 3 = 1.2041 − 0.4771 = 0.7270, t = 6 × 0.7270 ÷ 0.3010 ≈ 14.5시간입니다.

⑦ 이 주제로 탐구보고서를 쓴다면

  1. 탐구 질문과 가설: "약을 자주 먹을수록 좋을까?" → 가설: 간격이 짧으면 몸속 양이 계속 쌓여 위험해지고, 길면 효과가 끊긴다.
  2. 자료 수집과 계산: 반감기와 1회 복용량을 정하고(실제 약은 의약품 설명서의 반감기를 참고), 간격별로 Sn을 직접 계산해 표로 정리한다. 위의 ③·④처럼 한 번씩 더한 값과 공식 값이 같은지 확인한다.
  3. 그래프: 엑셀이나 파이썬으로 시간에 따른 몸속 양을 톱니 모양 그래프로 그리고, 효과 기준선과 위험 기준선을 함께 표시한다.
  4. 결론과 한계: "공비가 1/4인 12시간 간격이 두 기준 사이에 머문다"처럼 수치로 결론을 쓴다. 한계로는 실제로는 약이 바로 흡수되지 않고 서서히 흡수된다는 점, 사람마다 반감기가 다르다는 점을 적는다.

더 나아가 보고 싶다면 이런 질문도 좋습니다.

  • 첫 번째에만 더 많이 먹으면(처음에 533mg) 처음부터 일정한 양을 유지할 수 있을까?
  • 약을 한 번 빼먹었을 때 다시 원래 범위로 돌아오려면 몇 번을 먹어야 할까?
  • 반감기가 4시간이라면 몇 시간 간격이 가장 알맞을까?

함께 읽으면 좋은 시리즈 글

다음 글 예고: 생물의 수는 왜 무한히 늘지 않을까요? 다음 시리즈에서는 연못 붕어의 수를 수열의 귀납적 정의로 계산하는 로지스틱 성장을 다룹니다.

세특 탐구 주제 시리즈는 매주 새 글이 올라옵니다. 블로그를 구독해 두시면 새 탐구 주제를 놓치지 않고 받아 보실 수 있습니다.

※ 이 글의 약 A는 수학 계산을 위한 가상의 예입니다. 실제 약의 복용량과 간격은 반드시 의사·약사의 안내를 따르세요.

세특 탐구 주제 시리즈 · 진로 연계편 (컴퓨터공학·소프트웨어공학)

지난 글 72의 법칙은 왜 성립할까?에서는 "연 8%면 약 9년 만에 돈이 2배가 된다"는 공식을 지수와 로그로 확인했습니다. 이번에는 한 걸음 더 나아가 이 공식을 계산기 프로그램으로 직접 만들어 봅니다. 이 글 아래쪽에 있는 계산기가 바로 그 결과물입니다.

요즘은 AI에게 물어보면 답을 바로 알려 줍니다. 그런데 컴퓨터공학이나 소프트웨어공학을 꿈꾸는 학생이라면 답 하나보다 답을 내는 과정을 직접 설계하고, 틀린 곳을 찾아 고쳐 본 경험이 훨씬 오래 남습니다. 이 글은 그 과정을 처음부터 끝까지, 실제로 만나 고친 버그까지 그대로 보여 드립니다.

코드는 계산기에 실제로 들어간 자바스크립트와, 학교 정보 시간에 많이 쓰는 파이썬 두 가지로 나란히 보여 드립니다. 두 언어는 모양만 조금 다를 뿐 생각하는 순서는 같습니다. 파이썬 코드는 그대로 복사해서 실행해 볼 수 있습니다.

주요단어: 72의 법칙, 계산기 만들기, HTML, 자바스크립트, 파이썬, 반복문, 알고리즘 비교, 상용로그, 좌표 변환, 디버깅, 테스트, 컴퓨터공학, 소프트웨어공학, 정보, 대수, 고등학교, 주제탐구

① 전제: 모든 프로그램은 "입력 → 처리 → 출력"이다

프로그램을 만들기 전에 가장 먼저 해야 할 일은 코드를 쓰는 것이 아니라 무엇을 받아서, 무엇을 하고, 무엇을 보여 줄지 정하는 것입니다. 72의 법칙 계산기는 이렇게 설계했습니다.

  • 입력: 원금(예: 100만 원)과 연이율(예: 8%)
  • 검사: 0이나 음수, 빈칸이 들어오면 계산하지 않고 안내 문구를 보여 줌
  • 계산: 72의 법칙 값(72 ÷ 8 = 9.00년)과 실제 복리 값(9.01년)
  • 출력: 결과 카드, 설명 문장, 그래프, 표

마지막 화살표를 눈여겨보세요. 사용자가 숫자를 하나 바꿀 때마다 ①부터 다시 실행해야 결과가 바로 바뀝니다. 자바스크립트에서는 입력칸에 input 이벤트를 걸어 이것을 처리합니다.

자바스크립트 (이 글의 계산기에 들어간 코드)

입력칸.addEventListener('input', calc);   // 숫자가 바뀌면 calc 함수를 다시 실행

파이썬 (학교에서 많이 쓰는 언어로 같은 일을 하는 코드)

파이썬에는 웹 화면의 입력칸이 없으니, 키보드로 숫자를 받는 input()을 while True 반복 안에 넣어 같은 흐름을 만듭니다. 그림1의 ①~④가 코드에 그대로 들어 있습니다. 멈추려면 Ctrl+C를 누르면 됩니다.

import math

while True:                                   # 계속 반복해서 새 숫자를 받음
    원금 = float(input("원금(만 원): "))        # ① 입력
    이율 = float(input("연이율(%): "))
    if 원금 <= 0 or 이율 <= 0:                 # ② 검사
        print("0보다 큰 숫자를 넣어 주세요.")
        continue
    법칙 = 72 / 이율                            # ③ 계산
    실제 = math.log(2) / math.log(1 + 이율 / 100)
    print(f"72의 법칙: {법칙:.2f}년, 실제: {실제:.2f}년")   # ④ 출력

100과 8을 넣으면 72의 법칙: 9.00년, 실제: 9.01년이 출력됩니다.

② 계산 방법 1: 반복문으로 한 해씩 따라가기

"돈이 2배가 되는 데 몇 년 걸릴까?"를 가장 쉽게 계산하는 방법은 컴퓨터에게 1년씩 직접 계산시키는 것입니다. 사람이 손으로 하는 방법을 그대로 옮긴 것이지요. 100만 원, 연 8%로 따라가 보겠습니다.

1년 뒤: 100만 × 1.08 = 108만 원
2년 뒤: 108만 × 1.08 = 116.64만 원
3년 뒤: 116.64만 × 1.08 = 125.97만 원
⋮
9년 뒤: 185.09만 × 1.08 = 199.90만 원 (아직 200만 원이 안 됨)
10년 뒤: 199.90만 × 1.08 = 215.89만 원 (200만 원을 넘음 → 멈춤)

이 과정을 코드로 쓰면 아래와 같습니다. "금액이 목표보다 작은 동안 계속 1.08을 곱하라"는 뜻입니다.

자바스크립트 (이 글의 계산기에 들어간 코드)

let 금액 = 100;        // 만 원
let 72의 법칙 계산기,자바스크립트,파이썬,프로그래밍 탐구,알고리즘,반복문,로그,컴퓨터공학 진로,소프트웨어공학,정보,세특 주제,년 = 0;
while (금액 < 200) {   // 2배인 200만 원이 될 때까지
  금액 = 금액 * 1.08;
  년 = 년 + 1;
}
// 반복이 끝나면 년 = 10

파이썬 (학교에서 많이 쓰는 언어로 같은 일을 하는 코드)

금액 = 100        # 만 원
년 = 0
while 금액 < 200:   # 2배인 200만 원이 될 때까지
    금액 = 금액 * 1.08
    년 = 년 + 1
print(년, round(금액, 2))   # 출력: 10 215.89

두 언어를 비교해 보면, 자바스크립트는 반복할 부분을 { } 중괄호로 묶고 파이썬은 들여쓰기로 묶는다는 차이만 있습니다.

이 방법은 이해하기 쉽지만 두 가지 한계가 있습니다. 첫째, 답이 "10년"처럼 정수로만 나옵니다. 실제로는 9년이 조금 지나서 2배가 되는데 말이지요. 둘째, 이율이 작으면 반복이 아주 많아집니다. 연 0.1%라면 1.001을 694번 곱해야 2배가 넘습니다(1.001693 ≈ 1.9990, 1.001694 ≈ 2.0010).

③ 계산 방법 2: 로그로 한 번에 계산하기

대수 시간에 배우는 로그를 쓰면 반복 없이 한 번에 답을 구할 수 있습니다. 2배가 되는 기간을 n년이라 하면

100만 × 1.08n = 200만
양변을 100만으로 나누면 → 1.08n = 2
양변에 상용로그를 취하면 → log 1.08n = log 2
로그의 성질 log an = n log a 를 쓰면 → n × log 1.08 = log 2
따라서 → n = log 2 ÷ log 1.08

상용로그표 값을 넣어 계산해 봅시다.

log 2 ≈ 0.3010, log 1.08 ≈ 0.0334
n ≈ 0.3010 ÷ 0.0334 ≈ 9.01년

확인: 1.089 ≈ 1.999 이므로 9년에서 아주 조금 더 지나면 2가 됩니다. ②에서 9년 뒤 199.90만 원이었던 것과 딱 맞습니다. 코드로는 한 줄입니다.

자바스크립트 (이 글의 계산기에 들어간 코드)

const 실제년수 = Math.log(2) / Math.log(1 + 이율 / 100);   // 8%면 9.006...
const 법칙년수 = 72 / 이율;                                // 8%면 9

파이썬 (학교에서 많이 쓰는 언어로 같은 일을 하는 코드)

import math
이율 = 8
실제년수 = math.log(2) / math.log(1 + 이율 / 100)   # 9.006...
법칙년수 = 72 / 이율                                # 9.0
print(math.log10(2) / math.log10(1.08))           # 상용로그로 해도 9.006...

자바스크립트의 Math.log와 파이썬의 math.log는 상용로그가 아니라 다른 밑을 쓰는 로그지만(파이썬에서 상용로그는 math.log10), 나눗셈 꼴로 쓰면 밑이 무엇이든 결과가 같습니다(로그의 밑 변환 공식). 그래서 상용로그로 손계산한 9.01년과 컴퓨터 결과가 일치합니다.

비교 방법 1: 반복문 방법 2: 로그 공식
연 8%일 때 계산 횟수 10번 곱셈 나눗셈 1번
연 0.1%일 때 계산 횟수 694번 곱셈 나눗셈 1번
결과 10년 (정수) 9.01년 (소수까지)
장점 원리가 눈에 보임 빠르고 정확함

이것이 컴퓨터공학에서 말하는 알고리즘 비교입니다. 같은 답을 내더라도 이율에 따라 일이 늘어나는 방법과, 언제나 한 번이면 되는 방법이 있습니다. 완성된 계산기에는 방법 2를 썼습니다.

④ 72의 법칙은 얼마나 정확할까: 프로그램으로 검증하기

공식을 만들었으면 정말 맞는지 확인해야 합니다. 프로그램으로 연이율 1%부터 36%까지 0.5%씩 바꿔 가며 72의 법칙 값과 실제 값을 모두 계산해 그래프로 그렸습니다.

연이율 72의 법칙 실제 값 오차
2% 36.00년 35.00년 +1.00년
6% 12.00년 11.90년 +0.10년
8% 9.00년 9.01년 −0.01년
12% 6.00년 6.12년 −0.12년
24% 3.00년 3.22년 −0.22년

8% 근처에서 오차가 거의 0이고, 이율이 아주 낮거나 높아지면 오차가 커집니다. 손으로는 다섯 개만 계산해도 힘들지만, 프로그램은 71개 이율을 순식간에 계산합니다. 이렇게 많은 경우를 빠르게 확인하는 것이 프로그래밍이 탐구에 주는 가장 큰 힘입니다. 위 표는 파이썬으로 이렇게 만들 수 있습니다.

파이썬

import math
for 이율 in [2, 6, 8, 12, 24]:
    법칙 = 72 / 이율
    실제 = math.log(2) / math.log(1 + 이율 / 100)
    print(f"{이율}%: 법칙 {법칙:.2f}년, 실제 {실제:.2f}년, 오차 {법칙 - 실제:+.2f}년")

리스트를 [x / 2 for x in range(2, 73)]로 바꾸면 1%부터 36%까지 0.5% 간격의 71가지를 모두 계산합니다. 결과를 matplotlib으로 그리면 그림3이 됩니다.

⑤ 화면에 그래프 그리기: 좌표 변환은 일차식이다

계산기 안의 그래프는 HTML의 canvas(그림판)에 직접 점을 찍어 그렸습니다. 그런데 여기서 문제가 하나 생깁니다. 수학의 좌표평면은 위로 갈수록 y가 커지지만, 컴퓨터 화면은 왼쪽 위가 (0, 0)이고 아래로 갈수록 y가 커집니다.

그래서 "(9년, 199.9만 원)"이라는 점을 화면의 픽셀 위치로 바꾸는 식이 필요합니다. 그림판 크기는 가로 640픽셀, 세로 320픽셀이고, 눈금 글자를 쓸 여백으로 왼쪽 62, 오른쪽 16, 위 20, 아래 40픽셀을 비웠습니다. 그래프는 0~30년, 0~1006.3만 원(100만 × 1.0830)을 보여 줍니다.

가로 위치: 그래프를 그릴 수 있는 폭 = 640 − 62 − 16 = 562픽셀
x = 62 + 562 × (9 ÷ 30) = 62 + 168.6 = 230.6픽셀

세로 위치: 그래프를 그릴 수 있는 높이 = 320 − 20 − 40 = 260픽셀, 바닥선은 320 − 40 = 280픽셀
y = 280 − 260 × (199.9 ÷ 1006.3) = 280 − 51.6 = 228.4픽셀

세로 식에서 빼기를 쓴 것이 핵심입니다. 금액이 클수록 화면에서는 위쪽, 즉 픽셀 값이 작은 쪽에 찍혀야 하니까요. 두 식 모두 일차식이라는 점도 눈여겨보세요. 게임 화면, 지도 앱, 주식 차트도 모두 이런 좌표 변환으로 그려집니다.

자바스크립트 (이 글의 계산기에 들어간 코드)

const x = t => 62 + 562 * t / 30;            // 년 → 가로 픽셀
const y = v => 280 - 260 * v / 1006.3;       // 만 원 → 세로 픽셀

파이썬 (학교에서 많이 쓰는 언어로 같은 일을 하는 코드)

x = lambda t: 62 + 562 * t / 30            # 년 → 가로 픽셀
y = lambda v: 280 - 260 * v / 1006.3       # 만 원 → 세로 픽셀
print(round(x(9), 1), round(y(199.9), 1))  # 출력: 230.6 228.4

⑥ 테스트하다 찾은 버그 3가지

프로그램은 처음부터 완벽하게 동작하지 않습니다. 이 계산기도 여러 숫자를 넣어 보며 실제로 아래 버그들을 찾아 고쳤습니다. 소프트웨어공학에서는 이 과정을 테스트와 디버깅이라고 부릅니다.

버그 1: "9년 뒤 200만 원 (아직 2배 전)"이라는 모순된 문장
9년 뒤 금액 199.90만 원을 정수로 반올림해서 "200만 원"으로 보여 줬더니, 2배가 됐는데 "아직 2배 전"이라고 쓰는 이상한 문장이 나왔습니다. 계산은 맞았지만 보여 주는 방식이 틀린 경우입니다. 소수 첫째 자리까지 보여 주도록 바꿔 "199.9만 원"이 되게 고쳤습니다.

버그 2: "709만 원로 2배를 넘어요"
원금 300만 원, 연 24%로 테스트하니 문장이 어색했습니다. "원"은 받침이 있어서 "으로"를 써야 하는데 "로"를 붙였기 때문입니다. 숫자가 바뀌어도 늘 자연스럽도록 "709.3만 원이 되어 2배를 넘어요"처럼 조사가 바뀌지 않는 문장으로 고쳤습니다.

버그 3: 그래프 오른쪽 끝 글자가 잘림
처음에는 그래프를 "2배 되는 기간 × 3"까지만 그렸더니 8배 지점이 그래프 오른쪽 끝에 붙어서 "8배 (27.0년)" 글자가 화면 밖으로 잘렸습니다. 그래프 범위를 3.3배로 넓히고, 오른쪽에 가까운 글자는 점의 왼쪽에 쓰도록 바꿨습니다.

세 버그 모두 "8%, 100만 원" 한 가지만 넣어 봤다면 찾지 못했을 것입니다. 이율을 높게, 원금을 다르게, 화면을 좁게 바꿔 가며 테스트한 덕분에 찾았습니다.

⑦ 완성된 계산기 써 보기

아래 계산기에 숫자를 직접 넣어 보세요. 원금과 연이율을 바꾸면 결과 카드, 설명 문장, 그래프, 표가 바로 바뀝니다. 이율을 30% 이상으로 올려 72의 법칙 오차가 커지는 것도 확인해 보세요.

72의 법칙 계산기

원금과 연이율을 넣으면 돈이 2배가 되는 데 걸리는 시간을 72의 법칙과 실제 복리 계산으로 비교해 줘요.

72의 법칙 (72 ÷ 연이율)
-
실제 복리로 2배 되는 시점
-
오차
-
 

연 1회 복리 기준이에요. 세금과 수수료는 계산하지 않았어요. 실제 2배 시점은 (1+r)ⁿ = 2 를 만족하는 n을 로그로 구한 값이에요.

⑧ 이 주제로 탐구보고서를 쓴다면

이 글의 과정을 그대로 따라 하면 정보 교과와 대수를 잇는 탐구보고서가 됩니다.

  1. 탐구 질문과 가설: "72의 법칙은 어느 이율에서 가장 정확할까? 반복문과 로그 공식 중 어떤 알고리즘이 더 효율적일까?" 가설 예시: "이율이 높을수록 72의 법칙의 오차가 커질 것이다."
  2. 필요한 자료와 방법: 연이율 1%~36%를 0.5%씩 바꾼 71가지 경우. ②의 반복문과 ③의 로그 공식을 각각 코드로 작성하고(파이썬으로 해도 충분합니다), 이율마다 반복 횟수와 결과를 기록합니다. 손계산으로 8%와 24% 두 경우를 직접 확인해 코드가 맞는지 검증합니다.
  3. 계산과 그래프: 그림3처럼 "이율–오차" 그래프와, 이율이 작아질 때 반복 횟수가 얼마나 늘어나는지(8%는 10번, 0.1%는 694번) 표로 정리합니다.
  4. 결론과 한계: 72의 법칙은 8% 근처에서 가장 정확하고, 로그 공식은 이율과 관계없이 계산 한 번으로 끝난다는 결론을 냅니다. 한계로 "연 1회 복리만 다뤘다", "세금과 수수료를 빼지 않았다"를 쓰고, 확장 질문으로 "월 복리라면 결과가 어떻게 달라질까?"를 남깁니다.

보고서에는 ⑥처럼 직접 겪은 버그와 고친 과정을 꼭 넣으세요. 결과만 있는 보고서보다 "어디서 막혔고 어떻게 해결했는지"가 있는 보고서가 컴퓨터공학 전공 적합성을 훨씬 잘 보여 줍니다.

⑨ 직접 해 보기 (답은 아래에)

  1. ②의 반복문을 고쳐서 100만 원이 연 8%로 3배(300만 원)가 되는 해를 구해 보세요.
  2. 로그로 3배가 되는 정확한 기간을 구해 보세요. (log 3 ≈ 0.4771)
  3. 2번 답에 8을 곱해 보세요. 3배가 되는 기간에도 "72의 법칙" 같은 규칙을 만들 수 있을까요?
답 보기

1. 14년 뒤 100만 × 1.0814 ≈ 293.7만 원(아직 3배 전), 15년 뒤 ≈ 317.2만 원 → 반복문의 답은 15년입니다. 자바스크립트는 while (금액 < 300), 파이썬은 while 금액 < 300:으로 목표만 바꾸면 됩니다.

2. n = log 3 ÷ log 1.08 ≈ 0.4771 ÷ 0.0334 ≈ 14.3년 (컴퓨터로 계산하면 14.27년)

3. 14.27 × 8 ≈ 114.2 이므로 "114 ÷ 연이율 ≈ 3배 되는 기간"이라는 규칙을 만들 수 있습니다. 114 ÷ 8 = 14.25년으로 실제 값과 0.02년밖에 차이 나지 않습니다. 이것을 흔히 "114의 법칙"이라고 부릅니다.

마무리

"72 ÷ 이율"이라는 한 줄짜리 공식도 계산기로 만들려면 입력 검사, 알고리즘 선택, 좌표 변환, 테스트까지 여러 단계를 거쳐야 합니다. 그리고 그 각 단계에 반복, 로그, 일차식 같은 고등학교 수학이 들어 있습니다. AI가 코드를 대신 써 주는 시대에도, 무엇을 만들지 설계하고 틀린 곳을 찾아내는 힘은 직접 만들어 본 사람만 가질 수 있습니다.

함께 읽으면 좋은 글: 72의 법칙은 왜 성립할까? 지수·로그로 탐구하는 복리의 수학 · RSA 암호의 수학 · 선형회귀 탐구

세특 탐구 주제 시리즈는 계속됩니다. 다음 진로 연계편에서는 대출 이자를 한 달씩 계산해 주는 대출 상환 시뮬레이터를 만들어 볼 예정입니다. 새 탐구 주제를 놓치지 않으려면 블로그를 구독해 주세요.

+ Recent posts