16회차 보충 풀이

2026-09-18 · Java / SQL

시험 당일에는 노트북 고장으로 응시하지 못했다. 동료 자료로 문제와 회차만 확인한 뒤 보충 풀이를 먼저 따로 작성했고, 그 뒤 같은 두 문제를 직접 풀어 제출해 둘 다 PASS 했다. 아래 카드에는 제출 코드와 보충 풀이가 함께 있다. “로컬 검증”은 이 저장소에서 돌려 본 결과이며 채점 화면이 아니다.

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)
16회차 보충

최댓값 구하기

DATETIME의 최댓값이 가장 늦게 들어온 시각이다.

2026-09-18 · 16회차 · 시험 당일 미응시, 이후 직접 풀어 제출해 PASS.

문제 원문 · 별도 보충 노트

SQL · 제출 코드 (PASS)
SELECT MAX(DATETIME) AS 시간
FROM ANIMAL_INS;

GROUP BY 없이 전체 행을 집계한다. 최댓값이 중복되어도 결과는 한 행이다. 이름·ID를 함께 SELECT하면 어느 행의 값인지 불명확해진다. 빈 집합의 MAX 결과는 NULL이다.

로컬 검증
MariaDB 임시 테이블: 날짜 순서 섞임·동일 최댓값·단일 행·빈 집합
기존 수업 데이터 변경 없음 / 프로그래머스 채점은 하지 않음