
알고리즘 Cheat Sheet 시리즈는 코딩 테스트를 풀다가 "이거 자바에선 뭐였지?", "파이썬은 어떻게 했더라?" 싶을 때 바로 펼쳐 보려고 만든 개인 참고용 정리입니다.
Java와 Python을 나란히 놓고, 문법 차이 때문에 실수하기 쉬운 부분만 짧게 정리합니다.

이번 주제는 Math입니다.
자바는 대부분 Math 클래스에 모여 있고, 파이썬은 내장 함수와 math 모듈에 나뉘어 있습니다.
함수 이름은 비슷하지만 반환 타입과 반올림 방식이 달라서 실수하기 쉽습니다.
import math # 파이썬은 math 모듈을 import 해야 한다 (abs, max, min, pow, round는 내장)
| 기능 | 자바 | 파이썬 | 비고 |
|---|---|---|---|
| 절댓값 | Math.abs(x) | abs(x) | |
| 최댓값 | Math.max(a, b) | max(a, b, c...) / max(lst) | 자바는 인자 2개만 |
| 최솟값 | Math.min(a, b) | min(a, b, c...) / min(lst) | 자바는 인자 2개만 |
| 거듭제곱 | Math.pow(a, b) → double | a ** b / pow(a, b) → int | |
| 제곱근 | Math.sqrt(x) → double | math.sqrt(x) → float | |
| 정수 제곱근 | (int) Math.sqrt(x) | math.isqrt(x) → int | 파이썬 3.8+ |
| 세제곱근 | Math.cbrt(x) | math.cbrt(x) | 파이썬 3.11+ |
int big = Math.max(a, Math.max(b, c)); // 3개 이상은 중첩
int p = (int) Math.pow(2, 10); // 1024, double이라 형변환 필요
big = max(a, b, c)
p = 2 ** 10 # 1024, 결과가 바로 int
| 기능 | 자바 | 파이썬 |
|---|---|---|
| 올림 | Math.ceil(x) → double | math.ceil(x) → int |
| 내림 | Math.floor(x) → double | math.floor(x) → int |
| 반올림 | Math.round(x) → long | round(x) → int |
| 소수점 버림 | (int) x | int(x) / math.trunc(x) |
| 소수 n째 자리 반올림 | Math.round(x * 100) / 100.0 | round(x, 2) |
| 소수 n째 자리까지 출력 | String.format("%.2f", x) | f"{x:.2f}" |
| 값 | 자바 Math.round | 파이썬 round |
|---|---|---|
2.5 | 3 | 2 |
3.5 | 4 | 4 |
-2.5 | -2 | -2 |
Math.round(x)는 floor(x + 0.5) 방식이다. 그래서 -2.5는 -2가 된다.round()는 은행가 반올림이라 .5일 때 짝수 쪽으로 간다.math.floor(x + 0.5)를 쓰거나 decimal 모듈의 ROUND_HALF_UP을 쓴다.a / b를 올림하고 싶을 때, 실수로 바꾸지 않고 정수만으로 계산하는 방법이다.
int q = (a + b - 1) / b; // a, b가 양수일 때
q = (a + b - 1) // b # a, b가 양수일 때
q = -(-a // b) # 음수에서도 동작
| 기능 | 자바 | 파이썬 |
|---|---|---|
| 몫 (0 방향 버림) | a / b | int(a / b) |
| 몫 (내림) | Math.floorDiv(a, b) | a // b |
나머지 (부호가 a를 따름) | a % b | math.fmod(a, b) |
나머지 (부호가 b를 따름) | Math.floorMod(a, b) | a % b |
| 몫과 나머지 한 번에 | - | divmod(a, b) |
-7 / 2; // -3
-7 % 2; // -1
Math.floorDiv(-7, 2); // -4 (파이썬 // 와 같음)
Math.floorMod(-7, 2); // 1 (파이썬 % 와 같음)
음수 인덱스를 순환시킬 때(
(i - 1) % n) 자바는 음수가 나올 수 있다.Math.floorMod(i - 1, n)또는((i - 1) % n + n) % n을 쓰자.
| 항목 | 자바 | 파이썬 |
|---|---|---|
| 정수 최댓값 | Integer.MAX_VALUE (약 21억)Long.MAX_VALUE (약 922경) | 제한 없음 |
| 무한대 | Integer.MAX_VALUE 등으로 대체Double.POSITIVE_INFINITY | float('inf') / math.inf |
| 오버플로우 감지 | Math.addExact(a, b)Math.multiplyExact(a, b) | 필요 없음 |
| 아주 큰 수 | BigInteger | 그냥 int |
a^b % mod처럼 결과가 큰 거듭제곱은 Math.pow를 쓰면 안 된다. double이라 정밀도가 깨진다.

// 빠른 거듭제곱 (분할 정복)
static long modPow(long a, long b, long mod) {
long result = 1;
a %= mod;
while (b > 0) {
if ((b & 1) == 1) result = result * a % mod;
a = a * a % mod;
b >>= 1;
}
return result;
}
pow(a, b, mod) # 내장 함수가 세 번째 인자로 모듈러를 지원한다
| 기능 | 자바 | 파이썬 |
|---|---|---|
| 최대공약수 | 직접 구현 / BigInteger.gcd | math.gcd(a, b) |
| 최소공배수 | a / gcd(a, b) * b | math.lcm(a, b) (3.9+) |
| 팩토리얼 | 직접 구현 | math.factorial(n) |
| 조합 nCr | 직접 구현 | math.comb(n, r) (3.8+) |
| 순열 nPr | 직접 구현 | math.perm(n, r) (3.8+) |
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
static int lcm(int a, int b) {
return a / gcd(a, b) * b; // 곱하기 먼저 하면 오버플로우 위험
}
math.gcd(12, 18) # 6
math.lcm(12, 18) # 36
math.comb(5, 2) # 10
| 기능 | 자바 | 파이썬 |
|---|---|---|
| 자연로그 | Math.log(x) | math.log(x) |
| 상용로그 | Math.log10(x) | math.log10(x) |
| 밑이 2인 로그 | Math.log(x) / Math.log(2) | math.log2(x) |
| 임의의 밑 | Math.log(x) / Math.log(b) | math.log(x, b) |
| 원주율 | Math.PI | math.pi |
| 부호 | Math.signum(x) | (x > 0) - (x < 0) |
난수 [0, 1) | Math.random() | random.random() |
정수 난수 [a, b] | (int) (Math.random() * (b - a + 1)) + a | random.randint(a, b) |
| 기능 | 자바 | 파이썬 |
|---|---|---|
| 합계 | Arrays.stream(arr).sum() | sum(arr) |
| 최댓값 | Arrays.stream(arr).max().getAsInt() | max(arr) |
| 최솟값 | Arrays.stream(arr).min().getAsInt() | min(arr) |
| 평균 | Arrays.stream(arr).average().getAsDouble() | sum(arr) / len(arr) |
자바 스트림은 편하지만 반복 호출하면 느리다. 반복문 안에서는
for문으로 직접 계산하는 게 안전하다.
Math는 대부분 double을 반환한다. pow, sqrt, ceil, floor는 (int)로 형변환하고, round는 long이다. 파이썬 math.ceil / math.floor는 바로 int다.2.5는 자바 3, 파이썬 2(은행가 반올림)//, %와 같게 하려면 자바는 Math.floorDiv, Math.floorMod를 쓴다.Math.pow 금지. 자바는 빠른 거듭제곱을 직접 구현하고, 파이썬은 pow(a, b, mod)를 쓴다.long으로, 최소공배수는 나누기를 먼저!