수학 세특에 코딩을 넣는다고요? 가능합니다, 이렇게 하면 됩니다
학종 준비 오픈채팅방에 이런 질문이 올라왔어요.
"컴공 희망하는데 수학 탐구 주제를 약물농도분석 이차함수, 도형의 방정식 GPS, 다항식 암호화기술 중 어떤 걸 생기부에 넣는 게 좋을까요?"
답변은 명확했습니다. "2번째나 3번째요."
왜 그 답이 나왔는지, 그리고 실제로 어떻게 세특으로 연결할 수 있는지 오늘 풀어볼게요.
왜 암호화 기술과 GPS인가요?
약물농도분석도 나쁜 소재는 아닙니다. 하지만 컴공 지망 학생 입장에서 보면 이야기가 달라져요. 약물농도는 생명과학·의학 계열 생기부에서 훨씬 자연스럽게 연결됩니다.
반면 암호화 기술과 GPS는 수학 교과 내용을 배우는 순간 "이게 실제로 어떻게 쓰이는 거지?"라는 질문이 자연스럽게 나오는 소재예요. 그리고 그 답을 파이썬으로 직접 구현해볼 수 있다는 게 가장 큰 강점입니다. 컴공 지망 학생이라면 수학 세특에서 이 두 가지 중 하나를 선택하는 게 스토리가 훨씬 잘 연결됩니다.
첫 번째 소재 — 다항식과 RSA 암호화
수업 시간에 배운 그 다항식이 맞아요
고2 대수(수1) 시간에 다항식 단원을 배웁니다. 인수분해, 소인수분해, 나머지 정리... 배우면서 "이걸 왜 배우나" 싶은 학생들이 꽤 많죠.
그런데 이 소인수분해가 현재 전 세계 인터넷 보안의 핵심입니다. 여러분이 쇼핑몰에서 카드 결제를 할 때, 카카오톡 메시지를 보낼 때, 은행 앱에 로그인할 때 RSA 암호화 알고리즘이 작동하고 있어요.
원리는 단순합니다. 두 소수를 곱하는 건 쉽지만, 그 결과만 보고 어떤 두 소수를 곱한 건지 거꾸로 찾아내는 건 엄청나게 어렵다는 점을 이용하는 거예요.
예를 들어 13 × 17 = 221이라는 건 순식간에 계산이 되죠. 그런데 반대로 221이라는 숫자만 주고 "이게 어떤 두 소수의 곱이냐"고 물으면 직접 나눠봐야 알 수 있습니다. 숫자가 수백 자리로 커지면 슈퍼컴퓨터로도 수천 년이 걸려요. 이게 RSA 암호화의 핵심 원리입니다.
파이썬으로 직접 구현해 보기
# RSA 암호화/복호화 직접 구현
import math
import random
def is_prime(n):
"""소수 판별 함수"""
if n < 2:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
def gcd(a, b):
"""최대공약수 (유클리드 호제법)"""
while b:
a, b = b, a % b
return a
def mod_inverse(e, phi):
"""모듈러 역원 계산 (확장 유클리드 알고리즘)"""
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
gcd, x1, y1 = extended_gcd(b % a, a)
return gcd, y1 - (b // a) * x1, x1
_, x, _ = extended_gcd(e % phi, phi)
return (x % phi + phi) % phi
def generate_rsa_keys(p, q):
"""RSA 키 쌍 생성"""
n = p * q # 공개키의 일부
phi = (p-1) * (q-1) # 오일러 파이 함수
# 공개 지수 e 선택 (phi와 서로소인 수)
e = 65537 # 일반적으로 사용하는 값
# 개인 지수 d 계산
d = mod_inverse(e, phi)
return (e, n), (d, n) # (공개키), (개인키)
def rsa_encrypt(message, public_key):
e, n = public_key
return pow(message, e, n) # message^e mod n
def rsa_decrypt(ciphertext, private_key):
d, n = private_key
return pow(ciphertext, d, n) # ciphertext^d mod n
# 예시 실행
p, q = 61, 53 # 실제는 수백 자리 소수 사용
public_key, private_key = generate_rsa_keys(p, q)
message = 42 # 암호화할 숫자
encrypted = rsa_encrypt(message, public_key)
decrypted = rsa_decrypt(encrypted, private_key)
print(f"원본 메시지: {message}")
print(f"암호화된 값: {encrypted}")
print(f"복호화된 값: {decrypted}")
print(f"공개키: e={public_key[0]}, n={public_key[1]}")
print(f"복호화 성공: {message == decrypted}")
# 소수 크기에 따른 보안성 분석
import time
print("\n--- 소수 크기별 인수분해 시간 비교 ---")
for bits in [10, 20, 30]:
n = (2**bits - 1) * (2**(bits+2) + 1)
start = time.time()
# 단순 인수분해 시도
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
break
elapsed = time.time() - start
print(f"비트수 {bits*2}: 인수분해 시간 {elapsed:.4f}초")
코드를 직접 실행해보면 소수가 커질수록 인수분해 시간이 기하급수적으로 늘어나는 걸 확인할 수 있어요. 이 차이를 표나 그래프로 시각화하면 그게 바로 탐구 보고서의 핵심 결과가 됩니다.
세특에 이렇게 담길 수 있어요
대수 수업에서 소인수분해와 나머지 정리를 학습하던 중 이 원리가 현대 암호화 시스템의 기반임을 알게 되어 RSA 알고리즘을 탐구함. 두 소수의 곱은 쉽게 계산되지만 역방향 인수분해는 계산 복잡도가 급증한다는 비대칭성을 직접 확인하고자 Python으로 RSA 암호화·복호화 과정을 구현함. 소수 크기별 인수분해 소요 시간을 측정·비교하여 키 길이와 보안성의 관계를 수치로 분석하고, 실생활 보안 시스템에서 수학이 어떻게 활용되는지를 보고서로 정리함.
두 번째 소재 — 도형의 방정식과 GPS 삼변측량
위성 세 개가 원을 그리면 위치가 나온다
고2 기하 시간에 도형의 방정식을 배웁니다. 원의 방정식, 두 원의 교점... 이것도 "왜 배우나" 싶은 단원 중 하나죠.
그런데 여러분 스마트폰의 GPS가 정확히 이 원리로 작동합니다. 위성 하나가 신호를 보내면 "나로부터 반경 r1 안에 있다"는 정보가 생깁니다. 이게 원이에요. 위성 두 개면 두 원의 교점인 두 후보 지점이 남고, 세 번째 위성까지 추가되면 단 하나의 교점, 즉 정확한 위치가 결정됩니다. 이걸 삼변측량(Trilateration)이라고 해요.
기하 시간에 배운 원의 방정식과 연립방정식이 실제로 GPS에서 이렇게 작동한다는 걸 알면, 수업 내용이 완전히 다르게 보이기 시작합니다.
파이썬으로 시각화하기
import numpy as np
import matplotlib.pyplot as plt
import folium
plt.rcParams['font.family'] = 'Malgun Gothic'
def trilateration_2d(p1, r1, p2, r2, p3, r3):
"""
2D 삼변측량으로 위치 계산
p1, p2, p3: 기준점 좌표 (x, y)
r1, r2, r3: 각 기준점까지의 거리
"""
x1, y1 = p1
x2, y2 = p2
x3, y3 = p3
# 연립방정식으로 교점 계산
A = 2 * (x2 - x1)
B = 2 * (y2 - y1)
C = r1**2 - r2**2 - x1**2 + x2**2 - y1**2 + y2**2
D = 2 * (x3 - x2)
E = 2 * (y3 - y2)
F = r2**2 - r3**2 - x2**2 + x3**2 - y2**2 + y3**2
x = (C * E - F * B) / (E * A - B * D)
y = (C * D - A * F) / (B * D - A * E)
return x, y
# 기준점 설정 (위성 위치)
satellite1 = (0, 0)
satellite2 = (10, 0)
satellite3 = (5, 8)
# 실제 위치 (37.5665, 126.9780) = 서울시청 근처 가정
actual_pos = (5, 3)
# 각 위성까지의 거리 계산
r1 = np.sqrt((actual_pos[0]-satellite1[0])**2 + (actual_pos[1]-satellite1[1])**2)
r2 = np.sqrt((actual_pos[0]-satellite2[0])**2 + (actual_pos[1]-satellite2[1])**2)
r3 = np.sqrt((actual_pos[0]-satellite3[0])**2 + (actual_pos[1]-satellite3[1])**2)
# 삼변측량으로 위치 계산
estimated = trilateration_2d(satellite1, r1, satellite2, r2, satellite3, r3)
# 시각화
fig, ax = plt.subplots(figsize=(10, 10))
# 각 위성의 신호 범위(원) 그리기
theta = np.linspace(0, 2*np.pi, 300)
for sat, r, color, label in [
(satellite1, r1, 'blue', '위성1'),
(satellite2, r2, 'red', '위성2'),
(satellite3, r3, 'green', '위성3')
]:
ax.plot(sat[0] + r*np.cos(theta), sat[1] + r*np.sin(theta),
color=color, alpha=0.4, linewidth=2, label=f'{label} 신호 범위')
ax.plot(*sat, 'o', color=color, markersize=12)
ax.plot(*actual_pos, '*', color='gold', markersize=20,
label=f'실제 위치 {actual_pos}', zorder=5)
ax.plot(*estimated, 'x', color='black', markersize=15,
markeredgewidth=3, label=f'계산된 위치 ({estimated[0]:.2f}, {estimated[1]:.2f})')
ax.set_xlim(-8, 18)
ax.set_ylim(-8, 16)
ax.set_xlabel('X 좌표')
ax.set_ylabel('Y 좌표')
ax.set_title('삼변측량(Trilateration) - GPS 위치 계산 원리')
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
plt.tight_layout()
plt.show()
print(f"실제 위치: {actual_pos}")
print(f"계산된 위치: ({estimated[0]:.4f}, {estimated[1]:.4f})")
# folium으로 실제 지도 위에 시각화
m = folium.Map(location=[37.5665, 126.9780], zoom_start=13)
# 서울 주요 지점 3개를 위성 역할로 설정
locations = {
'기준점1(광화문)': [37.5759, 126.9768],
'기준점2(서울역)': [37.5547, 126.9706],
'기준점3(남산)': [37.5512, 126.9882]
}
for name, coord in locations.items():
folium.Marker(coord, popup=name,
icon=folium.Icon(color='blue')).add_to(m)
folium.Marker(
[37.5665, 126.9780],
popup='추정 위치',
icon=folium.Icon(color='red', icon='star')
).add_to(m)
m.save('gps_trilateration.html')
print("지도 파일 저장 완료!")
matplotlib으로 원의 교점이 위치가 되는 과정을 시각화하고, folium으로 실제 지도 위에 기준점과 추정 위치를 표시하면 시각적으로 완성도 높은 탐구 결과물이 나옵니다.
세특에 이렇게 담길 수 있어요
기하 수업에서 원의 방정식과 두 원의 교점을 학습하던 중 이 원리가 GPS 위치 계산에 그대로 적용됨을 발견함. 위성 세 개의 신호 도달 시간으로부터 거리를 계산하고 세 원의 교점으로 위치를 결정하는 삼변측량 알고리즘을 Python으로 직접 구현함. matplotlib으로 원의 방정식 시각화 과정을 구현하고 folium 라이브러리를 활용해 실제 지도 위에 위치 추정 결과를 표시함. 신호 오차가 발생할 경우 위치 정확도가 어떻게 달라지는지 추가로 분석하여 현실 GPS의 오차 보정 필요성을 이해함.
두 소재, 어떻게 선택하면 될까요?
꼭 하나만 골라야 하는 건 아닙니다. 수학 세특에 한 가지, 정보나 프로그래밍 세특에 다른 한 가지를 넣는 방식으로 분배할 수도 있어요.
진로 방향으로 보면 보안·암호학에 관심 있는 학생은 RSA 암호화가 훨씬 스토리가 자연스럽게 이어지고, 위치기반서비스·임베디드·자율주행 쪽에 관심 있는 학생이라면 GPS 삼변측량이 더 잘 맞습니다. 둘 다 컴공 지망 학생에게 수학 세특에서 코딩 역량을 자연스럽게 드러낼 수 있는 최고의 소재예요.
수업 시간에 배운 개념이 실제 세상에서 이렇게 작동한다는 걸 직접 코드로 확인해보는 경험, 저희 원당컴퓨터학원 Python 융합과정에서 함께 해보실 수 있어요. 궁금하신 분들은 편하게 연락 주세요! 😊
📍 원당컴퓨터학원 인천시 서구 당하동 장원프라자 502호 ☎ 032-565-5497
#원당컴퓨터학원 #수학세특코딩연계 #RSA암호화파이썬 #GPS삼변측량파이썬 #고2대수세특 #고2기하세특 #학생부종합전형 #생기부세특 #컴공생기부 #파이썬프로젝트 #암호화알고리즘 #도형의방정식GPS #folium지도시각화 #인천코딩학원 #서구코딩학원 #당하동학원 #Python융합과정 #수학파이썬연계
'학생부종합전형' 카테고리의 다른 글
| 친구랑 같이 만든 파이썬 프로젝트, 생기부에 이렇게 쓰일 수 있습니다 (1) | 2026.04.03 |
|---|---|
| 건강보험료는 왜 오르는 걸까요? — 공공데이터로 직접 분석하는 Python 프로젝트 (4) | 2026.04.02 |
| 통합과학 시간에 배운 앙부일구와 삼각측량, 코딩으로 다시 살아난다면? (4) | 2026.04.01 |
| 체스 로봇이 학원 책상 위에 있다고요? 거기서 AI 프로젝트가 시작됩니다 (3) | 2026.03.31 |
| "완벽한 이해는 오만일 수 있다" — 서울대 컴공 합격생이 남긴 말 (1) | 2026.03.26 |