나머지 연산이란?
a % b는 a를 b로 나눈 나머지입니다. 단순해 보이지만, "주기", "홀짝", "큰 수
다루기" 등 수많은 문제의 핵심 도구입니다.
1. 기본 의미
cout << 17 % 5 << '\n'; // 2 (17 = 5*3 + 2)
cout << 10 % 2 << '\n'; // 0 (나누어 떨어짐)
a % b의 결과는 항상 \(0\) 이상 \(b\) 미만입니다(양수 기준). 그래서 0부터 b-1까지의
값으로 분류하는 데 자연스럽게 쓰입니다.
2. 가장 흔한 쓰임 3가지
(1) 홀짝 판정
if (n % 2 == 0) cout << "짝수";
else cout << "홀수";
(2) 배수 판정 — "k의 배수인가?"는 n % k == 0.
(3) 순환(주기) — 시계처럼 일정 주기로 돌아오는 값.
int hour = (now + add) % 24; // 24시간이 지나면 0으로
3. 나머지 연산의 성질
큰 수를 다룰 때 핵심이 되는 성질입니다. 나머지는 더하기·곱하기 전에 미리 취해도
결과가 같습니다.
$$ (a + b) \bmod m = ((a \bmod m) + (b \bmod m)) \bmod m $$
$$ (a \times b) \bmod m = ((a \bmod m) \times (b \bmod m)) \bmod m $$
덕분에 "답을 1,000,000,007로 나눈 나머지를 출력" 같은 문제에서 중간중간 나머지를
취해 수가 커지는 것을 막을 수 있습니다.
const int MOD = 1000000007;
long long ans = 1;
for (int i = 1; i <= n; i++)
ans = ans * i % MOD; // 매번 나머지 -> 오버플로 방지
4. 음수 나머지 주의
C++에서 -7 % 3은 -1이 나옵니다(음수!). "항상 0 이상"으로 만들려면:
int r = ((x % m) + m) % m; // 0 이상 m 미만 보장
파이썬의 %는 항상 0 이상이라 이 보정이 필요 없습니다.
복잡도
나머지 연산은 \(O(1)\)입니다. 다만 큰 수 문제에서 "언제 나머지를 취할지"의 설계가
중요합니다.
정리
a % b는 \(0\) 이상 \(b\) 미만(양수).- 홀짝·배수·주기 처리의 기본 도구.
- 더하기·곱하기 전에 나머지를 취해도 결과가 같다 — 오버플로 방지.
- C++의 음수 나머지는 음수가 될 수 있다.