PYTHON TURTLE · VECTOR GEOMETRY

30번 문제를 거북이로 그려서
파이썬 코드로 해석하기

등변사다리꼴 → 좌표 → 벡터 내적 → 직각 조건 → 지름을 보는 두 원 → 교점 X → 최종 내적의 합 457

1. 먼저 주어진 30번 문제를 봅시다

수식을 먼저 계산하기보다, 어떤 도형이 만들어지는지 Turtle 화면에 그대로 옮기는 것이 목표입니다.

30번 원문 문제
코딩 관점 문제의 조건 하나하나를 좌표, 선분, 원, 교점, 벡터라는 프로그래밍 객체로 바꾸면 복잡한 기하 문제가 단계적인 알고리즘으로 보입니다.

2. 수학 문제를 Turtle 명령으로 번역하는 방법

점 A, B, C, D
좌표 튜플로 저장합니다.
A=(0,0), B=(24,0), C=(17,17), D=(7,17)
사다리꼴의 변
goto()로 네 점을 차례로 연결합니다.
XA·XD=0
두 벡터가 직각이므로 X는 AD를 지름으로 하는 원 위에 있습니다.
XB·XC=0
X는 동시에 BC를 지름으로 하는 원 위에 있습니다.
모든 가능한 X
두 원의 교점이므로 X₁=(12,5), X₂=(12,12)입니다.
최종 값
AD·AX₁=169, AD·AX₂=288, 합은 457입니다.

3. 문제해결 알고리즘

1
좌표계 설정A=(0,0), B=(24,0), D=(u,v), C=(24-u,v).
2
사다리꼴 결정거리와 내적 조건으로 u=7, v=17을 구합니다.
3
Turtle로 도형 그리기A-B-C-D를 연결하고 점 이름을 표시합니다.
4
직각을 원으로 변환AD와 BC를 각각 지름으로 하는 두 원을 그립니다.
5
두 원의 방정식x²+y²−7x−17y=0, x²+y²−41x−17y+408=0.
6
교점 찾기두 식을 빼서 x=12, 이어서 y=5,12를 얻습니다.
7
벡터 표시AD, AX₁, AX₂를 화살표로 그립니다.
8
내적 계산169+288=457을 화면과 콘솔에 출력합니다.
사다리꼴좌표직각 두 원X₁,X₂벡터457

4. Turtle 화면에서 최종적으로 보게 될 구조

X₁(12,5) X₂(12,12) A B C D 두 원의 교점 = 문제의 모든 X
중요한 기하 해석
XA·XD=0은 ∠AXD=90°라는 뜻입니다. 따라서 탈레스 정리에 의해 X는 AD를 지름으로 하는 원 위에 있습니다. 같은 이유로 XB·XC=0은 BC를 지름으로 하는 원을 만듭니다.

5. 완성형 IDLE Python Turtle 코드

파일 이름 주의 아래 코드를 저장할 때 turtle.py라는 이름은 사용하지 마세요. 표준 turtle 모듈과 충돌할 수 있으므로 problem30_turtle.py처럼 저장하는 것이 안전합니다.
import turtle
import math

# ============================================================
# 30번 문제를 Turtle로 시각화하기
#
# 중요:
# 이 파일의 이름을 turtle.py로 저장하지 마세요.
# 예: problem30_turtle.py
# ============================================================

# ------------------------------------------------------------
# 1. 화면과 거북이 설정
# ------------------------------------------------------------
screen = turtle.Screen()
screen.setup(1100, 760)
screen.title("30번 - 등변사다리꼴, 두 원의 교점, 벡터 내적")
screen.bgcolor("white")

t = turtle.Turtle()
t.speed(0)
t.hideturtle()
t.pensize(2)

# 수학 좌표를 화면에 크게 보이도록 확대
SCALE = 20
OX = -250
OY = -210

def P(x, y):
    """수학 좌표 (x,y)를 Turtle 화면 좌표로 변환"""
    return OX + SCALE * x, OY + SCALE * y

def move(x, y):
    t.penup()
    t.goto(*P(x, y))
    t.pendown()

def line(x1, y1, x2, y2, width=2):
    t.pensize(width)
    move(x1, y1)
    t.goto(*P(x2, y2))

def point(x, y, name, dx=8, dy=8):
    """점과 이름 표시"""
    t.penup()
    t.goto(*P(x, y))
    t.dot(10)
    sx, sy = P(x, y)
    t.goto(sx + dx, sy + dy)
    t.write(name, font=("Arial", 13, "bold"))

def circle_math(cx, cy, r, width=2):
    """수학 좌표계에서 중심 (cx,cy), 반지름 r인 원"""
    t.pensize(width)
    t.penup()
    sx, sy = P(cx, cy - r)
    t.goto(sx, sy)
    t.setheading(0)
    t.pendown()
    t.circle(r * SCALE)

def arrow(x1, y1, x2, y2, label=""):
    """벡터 화살표"""
    sx1, sy1 = P(x1, y1)
    sx2, sy2 = P(x2, y2)

    t.penup()
    t.goto(sx1, sy1)
    t.setheading(t.towards(sx2, sy2))
    t.pendown()
    t.pensize(3)
    t.goto(sx2, sy2)

    # 화살촉
    heading = t.heading()
    t.setheading(heading + 150)
    t.forward(12)
    t.backward(12)
    t.setheading(heading - 150)
    t.forward(12)

    if label:
        t.penup()
        t.goto((sx1 + sx2) / 2 + 8, (sy1 + sy2) / 2 + 8)
        t.write(label, font=("Arial", 11, "normal"))

# ------------------------------------------------------------
# 2. 원문제의 등변사다리꼴 좌표 결정
# ------------------------------------------------------------
#
# A=(0,0), B=(24,0), D=(u,v), C=(24-u,v)
#
# AD = 13√2
# → u² + v² = 338
#
# 벡터 조건
# AB·DC = AD·BC
# → u² - 24u + 119 = 0
# → u = 7 또는 17
#
# DC = 24 - 2u > 0 이므로 u < 12
# → u = 7
#
# v² = 338 - 49 = 289
# → v = 17
#
A = (0, 0)
B = (24, 0)
D = (7, 17)
C = (17, 17)

# ------------------------------------------------------------
# 3. 좌표축 그리기
# ------------------------------------------------------------
line(-2, 0, 27, 0, 1)
line(0, -2, 0, 20, 1)

# ------------------------------------------------------------
# 4. 등변사다리꼴 ABCD 그리기
# ------------------------------------------------------------
line(*A, *B, 3)
line(*B, *C, 3)
line(*C, *D, 3)
line(*D, *A, 3)

point(*A, "A(0,0)")
point(*B, "B(24,0)")
point(*C, "C(17,17)")
point(*D, "D(7,17)")

# ------------------------------------------------------------
# 5. X의 직각 조건을 '지름을 보는 원'으로 해석
# ------------------------------------------------------------
#
# XA·XD = 0
# → AX ⟂ DX
# → ∠AXD = 90°
# → X는 AD를 지름으로 하는 원 위에 있음
#
# XB·XC = 0
# → BX ⟂ CX
# → ∠BXC = 90°
# → X는 BC를 지름으로 하는 원 위에 있음
#
# 원 1: 지름 AD
center1 = ((A[0] + D[0]) / 2, (A[1] + D[1]) / 2)
r1 = math.dist(A, D) / 2

# 원 2: 지름 BC
center2 = ((B[0] + C[0]) / 2, (B[1] + C[1]) / 2)
r2 = math.dist(B, C) / 2

circle_math(*center1, r1, 2)
circle_math(*center2, r2, 2)

# ------------------------------------------------------------
# 6. 두 원의 교점 X를 방정식으로 계산
# ------------------------------------------------------------
#
# 원 1:
# x² + y² - 7x - 17y = 0
#
# 원 2:
# x² + y² - 41x - 17y + 408 = 0
#
# 두 식을 빼면
# -34x + 408 = 0
# → x = 12
#
x = 12

# 첫 번째 원에 x=12 대입
# y² - 17y + 60 = 0
a = 1
b = -17
c = 60

disc = b*b - 4*a*c
y1 = (-b - math.sqrt(disc)) / (2*a)
y2 = (-b + math.sqrt(disc)) / (2*a)

X1 = (x, y1)   # (12,5)
X2 = (x, y2)   # (12,12)

point(*X1, "X1(12,5)", 8, -22)
point(*X2, "X2(12,12)", 8, 8)

# 두 교점이 같은 수직선 x=12 위에 있음을 표시
line(12, 3, 12, 14, 1)

# ------------------------------------------------------------
# 7. 벡터 AD, AX1, AX2 시각화
# ------------------------------------------------------------
arrow(*A, *D, "AD=(7,17)")
arrow(*A, *X1, "AX1=(12,5)")
arrow(*A, *X2, "AX2=(12,12)")

# ------------------------------------------------------------
# 8. 마지막 내적 계산
# ------------------------------------------------------------
AD = (7, 17)
AX1 = (12, 5)
AX2 = (12, 12)

dot1 = AD[0] * AX1[0] + AD[1] * AX1[1]
dot2 = AD[0] * AX2[0] + AD[1] * AX2[1]
answer = dot1 + dot2

# 화면 위쪽에 계산 결과 표시
t.penup()
t.goto(-500, 315)
t.write(
    f"AD·AX1 = {dot1}    AD·AX2 = {dot2}    합 = {answer}",
    font=("Arial", 16, "bold")
)

# 콘솔에도 출력
print("A =", A)
print("B =", B)
print("C =", C)
print("D =", D)
print("X1 =", X1)
print("X2 =", X2)
print("AD · AX1 =", dot1)
print("AD · AX2 =", dot2)
print("최종 합 =", answer)

turtle.done()

6. 코드의 핵심 부분을 수학과 연결해서 읽기

파이썬 코드수학적 의미
A=(0,0), B=(24,0)밑변 AB를 x축에 놓아 계산을 단순화
D=(7,17), C=(17,17)사다리꼴 조건을 모두 사용해 확정된 꼭짓점
center1=(A+D)/2AD를 지름으로 하는 원의 중심
center2=(B+C)/2BC를 지름으로 하는 원의 중심
x=12두 원 방정식을 빼서 얻은 공통현의 직선
y1=5, y2=12두 원의 실제 교점 X₁, X₂
dot1AD·AX₁ = 169
dot2AD·AX₂ = 288
answer=dot1+dot2문제에서 요구한 모든 값의 합 = 457

7. 왜 두 원의 교점이 X인가?

초보자용 상세 설명

첫 번째 조건은

XA · XD = 0

입니다. 내적이 0이면 두 벡터가 서로 수직입니다.

AX ⟂ DX → ∠AXD = 90°

지름 AD를 바라보는 원주각은 90°이므로 X는 AD를 지름으로 하는 원 위에 있습니다.

두 번째 조건도 똑같이

XB · XC = 0 → ∠BXC = 90°

이므로 X는 BC를 지름으로 하는 원 위에 있습니다. 따라서 두 원이 만나는 곳만이 두 조건을 동시에 만족합니다.

8. 프로그램이 계산하는 두 교점

원 ① : x2 + y2 − 7x − 17y = 0
원 ② : x2 + y2 − 41x − 17y + 408 = 0

원 ②에서 원 ①을 빼면 이차항과 y항이 사라집니다.

−34x + 408 = 0 → x = 12

x=12를 첫 번째 원에 넣으면

y2 − 17y + 60 = 0 → (y−5)(y−12)=0
X₁=(12,5), X₂=(12,12)

9. 마지막 벡터 내적을 코드로 확인

첫 번째 교점
AD=(7,17), AX₁=(12,5)
7×12 + 17×5 = 169
두 번째 교점
AD=(7,17), AX₂=(12,12)
7×12 + 17×12 = 288
모든 X에 대한 값의 합
169 + 288 = 457

10. 이 문제에서 Turtle이 해 주는 역할

Turtle은 정답을 대신 증명하는 도구라기보다, 대수식이 실제 도형에서 무엇을 뜻하는지 눈으로 확인하는 시각화 도구입니다. 특히 이 문제에서는 “내적 0 → 직각 → 지름을 보는 원 → 두 원의 교점”이라는 연결이 그림으로 매우 분명해집니다.
학습 순서
먼저 코드를 그대로 실행해 그림을 확인한 뒤, draw 함수들을 하나씩 주석 처리하며 “사다리꼴만 보기 → 원 추가하기 → X 표시하기 → 벡터 추가하기” 순서로 실행하면 코드와 수학을 함께 이해하기 좋습니다.