개념

나머지와 범위

나머지 연산은 정수를 일정한 크기로 묶고 남는 값을 구합니다. 1717을 55개씩 묶으면 22가 남으므로 17 mod 5=217\bmod5=2입니다. 세 언어 모두 정수의 나머지 연산에 %를 사용합니다.

이 문서에서는 기준이 되는 수 MM을 양의 정수로 둡니다. A≥0A\ge0이면 나머지는 00 이상 MM 미만입니다. 특히 A mod M=0A\bmod M=0이면 AA는 MM의 배수입니다.

계산C++JavaPython
나머지 구하기17 % 5 → 217 % 5 → 217 % 5 → 2
배수 확인a % m == 0a % m == 0a % m == 0
짝수 확인a % 2 == 0a % 2 == 0a % 2 == 0

구한 나머지에 같은 나머지 연산을 다시 적용해도 값은 같습니다. 예를 들어 (17 mod 5) mod 5=2(17\bmod5)\bmod5=2입니다. 이미 00부터 M−1M-1 사이의 값으로 줄였기 때문입니다.

음수가 포함된 경우

C++과 Java의 % 결과는 00이거나 왼쪽 피연산자와 같은 부호입니다. Python은 기준 MM이 양수이면 결과가 항상 00 이상입니다.

계산C++JavaPython
음수의 나머지-7 % 3 → -1-7 % 3 → -1-7 % 3 → 2
음이 아닌 나머지r = a % m; 이후 r < 0이면 r += m;Math.floorMod(a, m)a % m

나머지가 음수이면 MM을 한 번 더해 00 이상 MM 미만으로 맞출 수 있습니다. 예를 들어 C++에서 −7 mod 3-7\bmod3의 결과 −1-1에 33을 더하면 22입니다. 순환하는 위치나 배열 인덱스를 구할 때는 이 범위의 값을 사용합니다.

같은 나머지와 주기성

2,7,12,172,7,12,17은 모두 55로 나눈 나머지가 22입니다. 두 수의 차이가 MM의 배수이면 MM으로 나눈 나머지가 같습니다. 이러한 관계를 합동이라고 하며 a≡b(modM)a\equiv b\pmod M으로 표시합니다.

0,1,2,3,40,1,2,3,4번 위치를 순환한다고 하겠습니다. 현재 위치가 44일 때 세 칸 이동한 위치는 (4+3) mod 5=2(4+3)\bmod5=2입니다. 한 바퀴에 해당하는 55칸을 더 이동해도 도착 위치가 같으므로 이동 횟수를 나머지로 줄일 수 있습니다.

덧셈·뺄셈·곱셈의 나머지

아래의  mod M\bmod M은 00 이상 MM 미만으로 맞춘 나머지를 뜻합니다.

(a+b) mod M=((a mod M)+(b mod M)) mod M(a+b)\bmod M=((a\bmod M)+(b\bmod M))\bmod M (a−b) mod M=((a mod M)−(b mod M)) mod M(a-b)\bmod M=((a\bmod M)-(b\bmod M))\bmod M (ab) mod M=((a mod M)(b mod M)) mod M(ab)\bmod M=((a\bmod M)(b\bmod M))\bmod M

각 수에서 MM의 배수인 부분을 빼도 나머지는 같습니다. 두 수를 더하거나 빼면 이 부분도 MM의 배수로 남습니다. 곱셈에서도 a=qM+ra=qM+r, b=pM+sb=pM+s로 쓰면 ab=qpM2+(qs+pr)M+rsab=qpM^2+(qs+pr)M+rs이므로 rsrs의 나머지만 구하면 됩니다.

M=5M=5, a=17a=17, b=9b=9이면 두 나머지는 각각 2,42,4입니다.

연산원래 값으로 계산나머지로 계산
덧셈26 mod 5=126\bmod5=1(2+4) mod 5=1(2+4)\bmod5=1
뺄셈8 mod 5=38\bmod5=32−4=−22-4=-2에 55를 더해 33
곱셈153 mod 5=3153\bmod5=3(2×4) mod 5=3(2\times4)\bmod5=3

여러 수의 합이나 곱도 계산할 때마다 나머지를 취할 수 있습니다. 거듭제곱 역시 곱셈을 반복하므로 같은 성질을 적용합니다. 다만 %는 곱셈이 끝난 뒤 적용되므로, 중간 곱이 자료형 범위 안에 들어가는지 확인해야 합니다.

나머지는 수의 크기 순서를 보존하지 않습니다. 9<129<12이지만 9 mod 5=49\bmod5=4는 12 mod 5=212\bmod5=2보다 큽니다. 최댓값이나 최솟값을 비교할 때는 원래 값을 기준으로 판단합니다.

복잡도

예제 범위의 정수 연산을 기준으로 합니다.

연산시간복잡도공간복잡도
나머지 계산과 음수 보정O(1)O(1)추가 O(1)O(1)

예제

문제

정수 AA와 양의 정수 MM이 주어진다. AA를 MM으로 나눈 나머지를 00 이상 MM 미만의 값으로 구하여라.

입력

첫째 줄에 정수 AA와 양의 정수 MM이 공백을 사이에 두고 주어진다. −9 999≤A≤9 999-9\,999\le A\le9\,999; 1≤M≤1001\le M\le100이다.

출력

구한 값을 출력한다.

예제 입력

7 3

예제 출력

1

예제 코드

C++20

#include <iostream>

using namespace std;

int main() {
    int a, m, r;

    cin >> a >> m;

    // 나머지를 0 이상 m 미만으로 보정
    r = a % m;
    if (r < 0) r += m;

    cout << r << '\n';
}