본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 라이브러리 4장 - 수학과 숫자 다루기 (맥OS 기준)

OS: MAC

참고: 👉 점프 투 파이썬 - 라이브러리 예제 바로가기

017. 과자를 똑같이 나누어 담으려면? ― math.gcd(매스.지디씨)

구분 내용 예시 결과
모듈 수학 함수 모듈 임포트 import math
기능 요약 두 수의 최대공약수 반환
(남김없이 나눌 수 있는 가장 큰 수)
import math
math.gcd(8, 12)
4
기본 문법 math.gcd(x, y) → int 반환(정수) import math
math.gcd(36, 60)
12
과자 나누기
(대표 예시)
과자 36개, 60개를
남김없이 동일 개수로 포장
import math
g = math.gcd(36, 60)
① print(g)
② print(36//g, 60//g)
 12 → 최대 12봉지까지 포장가능
3 5
  36개는 3봉지, 60개는 5봉지
여러 수 GCD (3.9+) 여러 개의 수의 최대공약수 import math
math.gcd(*[24, 36, 60])
12
음수/0 처리 음수도 OK(항상 양수 반환),
gcd(0, n)=n
math.gcd(-12, 8)
 math.gcd(0, 15)
4
 15
분수 기약화 분수 기약분수로 만들기 import math
n,d=84,126
g=math.gcd(n,d)
print(n//g, d//g)
2 3
84/126 = 2/3

라이브러리 예제 문제: 어린이집에서 사탕 60개, 초콜릿 100개, 젤리 80개를 준비했다. 아이들이 서로 싸우지 않도록 똑같이 나누어 봉지에 담는다고 하면 최대 몇 봉지까지 만들 수 있을까? 단, 사탕, 초콜릿, 젤리는 남기지 않고 모두 담도록 한다. 

점프 투 파이썬 - 라이브러리 예제 편 4장 17번 문제 풀이 및 결과

 

018. 버스가 동시에 도착할 시각을 알려면? ― math.lcm(매스.엘씨엠)

- math.lcm(a, b)는 두 수가 다시 동시에 만나는 최소 시점을 구하는 함수

구분 내용 예시 결과
모듈 수학 함수 모듈 임포트 import math
기능 요약 두 수의 최소공배수 반환
(공통 배수 중 가장 작은 수)
import math
math.lcm(6, 15)
30
기본 문법 math.lcm(x, y) → int 반환(정수형) import math
math.lcm(12, 18)
36
버스 도착 계산 (대표 예시) 15분 간격 버스와 20분 간격 버스가
동시에 도착하는 시각 계산
import math
bus1, bus2 = 15, 20
meet = math.lcm(bus1, bus2)
print(meet)
60
60분 후
(1시간마다 동시 도착)
여러 수 LCM (3.9+) 여러 개의 수의 최소공배수 import math
math.lcm(3, 4, 5)
60
음수/0 처리 음수 입력 시 자동으로 양수 반환lcm(0, n)=0 ① math.lcm(-6, 15)
② math.lcm(0, 12)
① 30
② 0
GCD와 관계식 a × b = gcd(a, b) × lcm(a, b) import math
print(math.gcd(12,18), math.lcm(12,18))
6 36
→ 12×18 = 6×36 
활용 예시 주기적 반복, 기계 동기화, 버스 도착 계산, 스케줄 맞추기

라이브러리 예제 문제: 어느 버스 정류장에 시내버스는 15분마다 도착하고 마을버스는 25분마다 도착한다고 한다. 오후 1시에 두 버스가 동시에 도착했다고 할 때 두 버스가 동시에 도착할 다음 시각을 알려면 어떻게 해야 할까?

점프 투 파이썬 - 라이브러리 예제 편 4장 18번 문제 풀이 및 결과

019. 소수점을 정확하게 계산하려면?―decimal.Decimal(데시멀디시멀)

- 금융·회계 계산: 가격, 세금, 이자율 등 오차 허용 불가한 계산에 필수

- 통계·소수점 정밀도: float 누적 오차 방지

- 과학 계산 시 정밀도 제어: getcontext().prec로 자릿수 조정 가능

- Decimal은 float의 오차를 없애고 “진짜 0.1 + 0.2 = 0.3” 을 만들어주는 정밀 계산 도구

구분 내용 예시 결과
모듈 소수점 오차 없이
정확한 계산을 위한 모듈
from decimal import Decimal
기능 요약 부동소수점(float)의 오차를 제거하고 정확한 십진 계산 수행 float(0.1 + 0.2)
Decimal('0.1') + Decimal('0.2')
0.30000000000000004
 0.3
기본 문법 Decimal('숫자') 형태로 사용 (문자열 입력 권장) Decimal('0.1') + Decimal('0.2') Decimal('0.3')
오차 비교
(대표 예시)
float 연산은
이진 부동소수점이라 오차 발생
 print(0.1 + 0.2)
 print(Decimal('0.1') + Decimal('0.2'))
 0.30000000000000004
 0.3
정확한 계산 (금융/가격 등) 금융 계산, 세금 계산 등 정확도 필수 계산에 사용 price = Decimal('19.99')
qty = Decimal('3')
print(price * qty)
59.97
반올림 제어
(ROUND_HALF_UP 등)
원하는 방식으로 소수점 처리 from decimal import ROUND_HALF_UP, getcontext
getcontext().rounding = ROUND_HALF_UP
print(Decimal('1.25').quantize(Decimal('0.1')))
1.3
정밀도 설정
(precision)
계산 자릿수(정밀도) 제한 가능 from decimal import getcontext
getcontext().prec = 5
print(Decimal('1') / Decimal('7'))
0.14286
문자열 입력 이유 Decimal(0.1)은 이미 float 오차를 포함하므로반드시 '0.1'처럼 문자열로 입력해야 함 Decimal(0.1) vs Decimal('0.1') 0.10000000000000000555... vs 0.1
관련 함수 math 모듈 대신 decimal 모듈에서 제공(덧셈, 곱셈, 나눗셈, 반올림 등 지원) Decimal('10') / Decimal('3') 3.333333333333333333333333333

020. 분수를 정확하게 계산하려면? ― fractions(프랙션스)

- 비율 계산: 케이크나 데이터 비율 등 정밀한 비율 표현

- 통계 및 비율 연산: float 오차 없는 확률 계산

- 수학 문제 풀이용: 자동 약분 및 기약분수 표현

- Fraction은 “소수 대신 분수 그대로 계산하는 도구” — 정확한 수학적 비율 계산에 강하다

구분 내용 예시 결과
모듈 분수(유리수) 계산을 위한 모듈 from fractions import Fraction
기능 요약 분수를 정확히 표현하고,
덧셈·뺄셈·곱셈·나눗셈을 정확하게 처리
Fraction(1, 3) + Fraction(1, 6) Fraction(1, 2)
기본 문법 Fraction(분자, 분모) 형태로 생성 Fraction(3, 5) 3/5
자동 기약분수화
(대표 예시)
입력 시 자동으로 최대공약수로 약분 Fraction(4, 6) 2/3
문자열/소수 변환 가능 문자열 "1/3", 또는 소수 0.5 로 변환 가능  Fraction('1/3')
 Fraction(0.5)
1/3
 1/2
사칙연산 (정확 계산)    print(Fraction(1, 3) + Fraction(1, 6))
 print(Fraction(3, 4) * Fraction(2, 3))
 1/2
 1/2
float과 비교 float은 근사값, Fraction은 정확한 수치  print(0.1 + 0.2)
 print(Fraction(1,10) + Fraction(1,5))
 0.30000000000000004
 3/10
소수로 변환 (float) float(Fraction) 로 실수 변환 가능 float(Fraction(1, 3)) 0.3333333333333333
분모 제한
(limit_denominator)
근사 분수 구할 때 사용 Fraction(3.141592).limit_denominator(1000) 355/113
정수 변환 분수가 정수일 경우 자동 변환 Fraction(8, 4) 2
decimal과의 차이 Decimal은 소수점 정밀도,
Fraction은 분수 형태로의 정확도 유지

라이브러리 예제 문제: 

점프 투 파이썬 - 라이브러리 예제 편 4장 20번 문제
점프 투 파이썬 - 라이브러리 예제 편 4장 20번 문제 해석 및 결과

021. 로또 번호를 뽑으려면? ― random(랜덤)

- random은 “세상에 하나뿐인 무작위 결과”를 만들어주는 파이썬의 복불복 담당 모듈

구분 설명 예시 결과
모듈 임의의 숫자, 순서, 샘플링 등 무작위(random) 데이터 생성 import random random.함수() 형태로 사용
random.random() 0 이상 1 미만의 난수(float) 생성 random.random() 0.2731 …
(매번 다름)
random.randint(a, b) a 이상 b 이하
정수
1개 무작위 선택
random.randint(1, 45) 5
(1이상 45이하 정수 무작위 선택으로 매번 다름)
random.randrange
(start, stop[, step])
range()처럼
간격 지정 가능 (stop 제외)
random.randrange(1, 46, 2) 17
random.choice(seq) 리스트, 문자열 등 시퀀스에서 임의의 원소 1개 선택 random.choice(['🍎','🍌','🍊']) '🍌'
random.choices
(seq, weights, k)
리스트에서 가중치 기반으로 k개 선택 (중복 가능) import random

fruits = ['🍎', '🍌', '🍇']
weights = [5, 3, 1]   # 🍎가 더 자주 뽑히게
result = random.choices(fruits, weights=weights, k=10)
print(result)
['🍎', '🍎', '🍎', '🍌', '🍎', 
'🍌', '🍎', '🍎', '🍇', '🍎']
random.sample(seq, k) 시퀀스에서
중복 없이 k개 추출
random.sample(range(1, 46), 6) [38, 39, 44, 28, 27, 6]
random.shuffle(list) 리스트의 순서를 섞음
(제자리 변경)
nums = [1,2,3,4,5]
random.shuffle(nums)
print(nums)
[2, 3, 5, 1, 4]
random.seed(n) 난수 시드 고정
(결과 재현 가능)
random.seed(10)
print(random.randint(1,10))
10 (항상 같은 값)
random.uniform(a,b) a 이상 b 이하 실수(float) 무작위 생성 random.uniform(1.5, 5.5) 1.6303402611282185

라이브러리 예제 문제: 1부터 45 사이의 서로 다른 숫자 6개로 이루어진 로또 번호를 추첨하는 프로그램을 만들려면 어떻게 해야 할까?(로또는 1부터 45까지의 숫자 중 6개가 맞으면 1등에 당첨되는 복권이다. 단, 숫자는 중복될 수 없다.)

점프 투 파이썬 - 라이브러리 예제 편 4장 21번 문제 해석 및 결과

 

022. 시험 결과의 평균값과 중앙값을 알려면? ―statistics(스태티스틱스)

- 시험 점수 분석: 평균/중앙값으로 전체 성적 수준 파악

- 매출 분석: 일평균/중앙 매출 구하기

- 데이터 정제: 이상치 감지 기준 설정 (평균±표준편차)

구분 내용 예시 결과
모듈 통계 계산을 위한 표준 모듈 import statistics  
statistics.mean(data) 평균값 (산술 평균) = 전체 합 ÷ 개수 statistics.mean([50, 60, 70]) 60
statistics.median(data) 중앙값 (가운데 위치한 값) = 데이터를 정렬 후 가운데 값 statistics.median([10, 20, 30, 40]) 25.0
statistics.mode(data) 최빈값 (가장 자주 등장한 값) = 가장 자주 등장한 값 statistics.mode([1, 2, 2, 3]) 2
statistics.stdev(data) 표준편차 (Standard Deviation) = 편차의 제곱 평균 statistics.stdev([10, 20, 30]) 10.0
statistics.variance(data) 분산 (Variance) = 분산의 제곱근 (데이터 퍼짐 정도) statistics.variance([10, 20, 30]) 100.0

라이브러리 예제 문제: 다음은 A반 학생 10명의 중간고사 수학 점수 데이터이다. 다른 반과 비교하고자 이 데이터를 이용하여 A반 수학 점수의 평균값과 중앙값을 구하려면 어떻게 해야 할까? 

marks = [78, 93, 99, 95, 51, 71, 52, 43, 81, 78]

점프 투 파이썬 - 라이브러리 예제 편 4장 22번 문제 해석 및 결과

+ 원의 둘레와 넓이를 구하려면? ― math.pi (매스 .파이)

구분 내용 예시 결과
모듈 수학 관련 함수와 상수 제공 import math  
math.pi 원주율(π) 상수 math.pi 3.141592653589793
math.e 자연상수 e (2.718...) math.e 2.718281828459045
math.sqrt(x) 제곱근 math.sqrt(16) 4.0
math.pow(x, y) 거듭제곱 (xʸ) math.pow(2, 3) 8.0
math.floor(x) 내림 math.floor(3.7) 3
math.ceil(x) 올림 math.ceil(3.2) 4
math.trunc(x) 소수점 버림 math.trunc(3.9) 3
문제 예시 결과
원의 둘레와 넓이 구하기 import math

r = 5  # 반지름
circumference = 2 * math.pi * r  # 원의 둘레
area = math.pi * (r ** 2)        # 원의 넓이

print("원의 둘레:", round(circumference, 2))
print("원의 넓이:", round(area, 2))
원의 둘레: 31.42
원의 넓이: 78.54

 

각도·회전 계산? ― math.tau(타우), math.degrees(디그리즈), math.radians(레디언스)

- math.pi는 반원(180°),
- math.tau는 한 바퀴(360°),
- math.degrees·math.radians는 각도 ↔ 라디안 변환기

구분 내용 예시 결과
모듈 수학 계산용 표준 모듈 import math  
math.pi = π 원주율 (반원 180°) math.pi 3.141592653589793
math.tau = τ 2π (하나의 원, 360°) math.tau 6.283185307179586
math.degrees(x) 각도를 라디안 → ° 로 변환
라디안 → 도(degree)
math.degrees(math.pi) 180.0
math.radians(x) 각도를 ° → 라디안 으로 변환
도(degree) → 라디안
math.radians(180) 3.141592653589793