1. 개념 소개
여러분, 약수라는 말을 들어본 적이 있나요? 약수란 어떤 수를 나누어떨어지게 만드는 숫자입니다. 쉽게 말하면, 어떤 수를 나누었을 때 나머지가 0이 되면, 그 숫자는 약수라고 할 수 있습니다.
예를 들어, 12라는 숫자를 생각해 보겠습니다.
• 1로 나누면 12 ÷ 1 = 12 (나머지 0, 약수입니다!)
• 2로 나누면 12 ÷ 2 = 6 (나머지 0, 약수입니다!)
• 3로 나누면 12 ÷ 3 = 4 (나머지 0, 약수입니다!)
• 4로 나누면 12 ÷ 4 = 3 (나머지 0, 약수입니다!)
이렇게 12를 나누었을 때 나머지가 0이 되는 숫자들은 모두 12의 약수입니다.
2. 실생활 예제
약수는 우리 일상에서도 쉽게 찾아볼 수 있습니다. 예를 들어, 초콜릿 12개가 들어 있는 상자가 있다고 생각해 보겠습니다. 이 초콜릿을 똑같이 나누어 친구들과 나누려면 어떻게 해야 할까요?
• 2명이서 나누면, 한 사람당 6개씩 받을 수 있습니다. (2는 12의 약수입니다!)
• 3명이서 나누면, 한 사람당 4개씩 받을 수 있습니다. (3은 12의 약수입니다!)
• 4명이서 나누면, 한 사람당 3개씩 받을 수 있습니다. (4도 12의 약수입니다!)
• 6명이서 나누면, 한 사람당 2개씩 받을 수 있습니다. (6 역시 12의 약수입니다!)
이렇게 초콜릿을 똑같이 나눌 수 있는 사람의 수가 바로 약수입니다. 나머지 없이 딱 맞게 나눌 수 있으면, 그 숫자는 약수라고 할 수 있습니다!
3. 간단한 파이썬 코드
기본 약수 찾기 코드
# 어떤 수의 약수를 찾는 프로그램
# 숫자를 입력받습니다.
number = int(input("약수를 찾고 싶은 숫자를 입력하세요: "))
print(f"{number}의 약수는 다음과 같습니다:")
# 1부터 입력한 숫자까지 반복하면서 약수를 찾습니다.
for i in range(1, number + 1):
if number % i == 0:
print(i)
코드 설명:
• input() 함수를 사용해 숫자를 입력받고, for 반복문을 통해 1부터 입력한 숫자까지 나눠서 나머지가 0인 경우에만 약수로 출력합니다.
더 효율적인 약수 찾기 코드
# 더 효율적인 약수 찾기 프로그램
import math # 제곱근을 계산하기 위해 math 모듈을 사용합니다.
# 숫자를 입력받습니다.
number = int(input("약수를 찾고 싶은 숫자를 입력하세요: "))
print(f"{number}의 약수는 다음과 같습니다:")
# 약수를 저장할 리스트 생성
divisors = []
# 1부터 제곱근까지 반복하면서 약수를 찾습니다.
# math.isqrt(number)는 number의 '정수 제곱근'을 반환합니다.
# 예를 들어, math.isqrt(12)는 3을 반환합니다 (3*3=9, 4*4=16이므로 3까지만 확인).
for i in range(1, int(math.isqrt(number)) + 1):
if number % i == 0:
divisors.append(i) # 작은 약수 추가
if i != number // i: # 짝이 되는 큰 약수 추가 (중복 방지)
divisors.append(number // i)
# 약수를 오름차순으로 정렬하여 출력합니다.
divisors.sort()
for divisor in divisors:
print(divisor)
math.isqrt() 함수 설명:
• **math.isqrt(number)**는 **‘정수 제곱근’**을 반환하는 함수입니다.
• 예를 들어, **math.isqrt(12)**는 3을 반환합니다. 이는 3²=9이고, 4²=16이므로 12의 제곱근은 3보다 크고 4보다 작기 때문입니다.
• 정수 제곱근까지만 반복하면 불필요한 계산을 줄이고 더 빠르게 약수를 찾을 수 있습니다.
4. 연습 문제
문제 1:
여러분이 좋아하는 숫자를 하나 정하고, 그 숫자의 약수를 모두 찾아보세요!
• 예: 24의 약수를 모두 찾으세요.
예시 코드:
# 숫자의 약수 찾기
number = int(input("약수를 찾고 싶은 숫자를 입력하세요: "))
print(f"{number}의 약수는 다음과 같습니다:")
for i in range(1, number + 1):
if number % i == 0:
print(i)
답:
24의 약수는 1, 2, 3, 4, 6, 8, 12, 24입니다.
문제 2:
1부터 50까지 숫자 중에서 **약수가 2개뿐인 숫자(소수)**를 찾아보세요.
예시 코드:
# 1부터 50까지의 소수 찾기
for number in range(1, 51):
divisor_count = 0 # 약수 개수 초기화
for i in range(1, number + 1):
if number % i == 0:
divisor_count += 1 # 약수일 때마다 개수 증가
if divisor_count == 2:
print(number)
답:
1부터 50까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47입니다.
문제 3:
아래에 있는 두 숫자의 약수를 모두 구하고, 공통된 약수를 찾아보세요.
• 예: 18과 24의 약수를 구한 뒤, 두 수의 공통 약수를 찾으세요.
• 보너스: 두 수의 **최대공약수(GCD)**는 무엇인가요?
예시 코드:
# 두 숫자의 공통 약수 찾기
num1 = int(input("첫 번째 숫자를 입력하세요: "))
num2 = int(input("두 번째 숫자를 입력하세요: "))
divisors_num1 = [i for i in range(1, num1 + 1) if num1 % i == 0]
divisors_num2 = [i for i in range(1, num2 + 1) if num2 % i == 0]
# 공통 약수 찾기
common_divisors = [i for i in divisors_num1 if i in divisors_num2]
print(f"{num1}의 약수: {divisors_num1}")
print(f"{num2}의 약수: {divisors_num2}")
print(f"공통된 약수: {common_divisors}")
# 최대공약수(GCD) 출력
print(f"{num1}과 {num2}의 최대공약수(GCD): {max(common_divisors)}")
답:
• 18의 약수: 1, 2, 3, 6, 9, 18
• 24의 약수: 1, 2, 3, 4, 6, 8, 12, 24
• 공통된 약수: 1, 2, 3, 6
• 최대공약수(GCD): 6
문제 4 (코딩 활동):
여러분이 배운 파이썬 코드를 활용해, 1부터 100까지의 숫자 중 약수가 가장 많은 숫자를 찾아보세요.
• 약수가 몇 개인지도 함께 출력해 보세요!
예시 코드:
# 1부터 100까지 약수가 가장 많은 숫자 찾기
max_divisors_count = 0
number_with_max_divisors = 0
for number in range(1, 101):
divisors = [i for i in range(1, number + 1) if number % i == 0]
if len(divisors) > max_divisors_count:
max_divisors_count = len(divisors)
number_with_max_divisors = number
print(f"1부터 100까지 중 약수가 가장 많은 숫자는 {number_with_max_divisors}입니다.")
print(f"약수의 개수: {max_divisors_count}")
답:
60은 약수가 가장 많은 숫자 중 하나이며, 약수의 개수는 12개입니다.
• 60의 약수: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60