16회차 보충
약수의 합
약수는 쌍으로 찾고, 완전제곱수의 제곱근은 한 번만 더한다.
2026-09-18 · 16회차 · 시험 당일 미응시, 이후 직접 풀어 제출해 PASS.
JAVA · 제출 코드 (PASS)
class Solution {
public int solution(int n) {
if (n == 0) return 0;
int answer = n; // 자기 자신을 먼저 더함
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
answer += i;
}
}
return answer;
}
}
n 자신을 뺀 약수 중 가장 큰 것은 n/2를 넘을 수 없다 — n을 2보다 작은 수로 나누면 몫이 n보다 커지기 때문이다. 그래서 n을 먼저 더해 두면 나머지는 1 ~ n/2에서만 찾으면 된다. 전수 탐색의 절반이고, 제한(3000) 안에서는 충분하다.
JAVA · 보충 풀이 (미제출)
class Solution {
public int solution(int n) {
int sum = 0;
for (int divisor = 1; divisor <= n / divisor; divisor++) {
if (n % divisor != 0) continue;
sum += divisor;
int pair = n / divisor;
if (pair != divisor) sum += pair;
}
return sum;
}
}
1~n 전수 탐색도 제한 안에서 충분하다. 위 풀이는 d와 n/d를 함께 더하므로 O(√n)이다. pair != divisor로 제곱근 중복을 막는다. n=0이면 반복이 없으므로 0이다.
로컬 검증
0 → 0 / 1 → 1 / 5 → 6 / 12 → 28 / 36 → 91 / 3000 → 9360 허용 범위 0~3000: 독립적으로 만든 기대값과 3,001개 비교 제출 코드·보충 풀이 둘 다 전 구간 일치 (JDK 21)