Python의 divmod() 함수는 표준 라이브러리에 포함된 내장 함수로, 두 개의 숫자를 매개변수로 받아 나눗셈의 몫(quotient)과 나머지(remainder)를 하나의 튜플(tuple)로 반환합니다. 숫자의 배수 여부를 확인하거나 소수(prime number)를 판별하는 등 다양한 수학적 문제 해결에 매우 유용하게 활용됩니다.
문법(Syntax)
divmod(a, b) a, b : b가 a를 나누는 구조 a와 b는 정수(int) 또는 실수(float) 모두 가능
divmod(a, b)는 내부적으로 a ÷ b 연산을 수행한 뒤, (몫, 나머지) 형태의 튜플을 돌려줍니다. 몫과 나머지를 각각 구할 때보다 코드가 간결해지고 한 번의 호출로 두 값을 얻을 수 있다는 장점이 있습니다.
기본 사용 예제
아래 예제에서는 정수와 실수 두 가지 경우를 살펴봅니다. divmod()를 적용하면 결과가 튜플로 반환되며, 입력값에 따라 튜플의 요소 역시 정수 또는 실수 값이 될 수 있습니다.
# 정수인 경우
print("5 and 2 give:", divmod(5, 2))
print("25 and 5 give:", divmod(25, 5))
# 실수인 경우
print("5.6 and 2 give:", divmod(5.6, 2))
print("11.3 and 9.2 give:", divmod(11.3, 9.2))실행 결과
5 and 2 give: (2, 1) 25 and 5 give: (5, 0) 5.6 and 2 give: (2.0, 1.5999999999999996) 11.3 and 9.2 give: (1.0, 2.1000000000000014)
정수끼리의 나눗셈은 정확한 결과를 반환하지만, 실수 연산에서는 부동소수점(floating-point) 특성상 약간의 오차가 포함된 값이 출력되는 점에 유의해야 합니다.
0이 입력되는 경우
첫 번째 인수가 0이면 결과는 항상 (0, 0)입니다. 반면 두 번째 인수(나누는 수)가 0이면 예상대로 ZeroDivisionError가 발생합니다.
예제
# 첫 번째 인수가 0인 경우
print("0 and 8 give:", divmod(0, 8))
# 두 번째 인수가 0인 경우
print("8 and 0 give:", divmod(8, 0))실행 결과
0 and 8 give: (0, 0)
Traceback (most recent call last):
File "xxx.py", line 6, in <module>
print("8 and 0 give:", divmod(8, 0))
ZeroDivisionError: integer division or modulo by zero배수 여부(나누어떨어짐) 확인하기
나눗셈 후 반환된 튜플의 두 번째 값, 즉 나머지가 0이라면 첫 번째 숫자는 두 번째 숫자로 나누어떨어진다는 의미입니다. 나머지가 0이 아니라면 나누어떨어지지 않는 것입니다.
예제
m = 12
n = 4
quotient, remainder = divmod(m, n)
print(quotient)
print(remainder)
if remainder == 0:
print(m, 'is divisible by', n)
else:
print(m, 'is not divisible by', n)실행 결과
3 0 12 is divisible by 4
튜플 언패킹(tuple unpacking)을 활용하면 몫과 나머지를 별도 변수에 깔끔하게 저장할 수 있어 코드의 가독성이 크게 향상됩니다.
소수 판별하기
divmod()를 활용하면 소수 판별 로직도 쉽게 구현할 수 있습니다. 어떤 수를 자기 자신부터 1까지 차례대로 나누면서 발생하는 나머지를 추적합니다. 소수는 자기 자신 외에는 나누어떨어지는 수가 없으므로 나머지가 0이 되는 횟수가 단 한 번뿐입니다. 따라서 나머지가 0인 횟수가 1을 초과하면 그 수는 소수가 아닙니다.
예제
num = 11
a = num
# 나머지가 0이 되는 횟수를 세는 카운터
count = 0
while a != 0:
q, r = divmod(num, a)
a -= 1
if r == 0:
count += 1
if count > 2:
print(num, 'is not Prime')
else:
print(num, 'is Prime')실행 결과
11 is Prime
정리
divmod() 함수는 단순하지만 강력한 도구입니다. 몫과 나머지를 동시에 얻을 수 있어 나누어떨어짐 검사, 소수 판별, 시간 단위 변환 등 다양한 상황에서 코드를 더 간결하고 효율적으로 만들어 줍니다. 다만 두 번째 인수로 0을 넘기면 ZeroDivisionError가 발생하므로, 사용 전에 나누는 값이 0이 아닌지 확인하는 것이 안전합니다.