알고리즘(백준 등) 공부/백준(자바)
백준 1419번: 등차수열의 합
posite
2026. 4. 24. 13:41
등차수열의 i번째 항이 x + (i-1)*d 로 표현되고(x는 첫번째 항, d는 공차) x, i, d 가 자연수일 때, 주어진 구간 안에서 첫번째 항부터 k번째 항 까지의 합이 될 수 있는 값의 갯수를 구하는 문제이다. k는 2보다 크거나 같고 5보다 작거나 같은 자연수이다.
k가 2, 3 ,4, 5 마다 가지는 규칙을 이용하여 해결한다. k가 2인 경우, 모든 항을 더하면 2x + d가 되어 구간에서 3보다 크거나 같은 자연수의 갯수가 된다. 3의 경우, 모든 항을 더하면 3x + 3d로 구간에서 6보다 크거나 같은 모든 3의 배수의 갯수가 된다. 4의 경우, 4x + 6d로 구간 내에서 12를 제외한 10보다 크거나 같은 2의 배수의 갯수가 된다. 5의 경우, 5x + 10d로 구간에서 15보다 크거나 같은 모든 5의 배수의 갯수가 된다.
if (k == 2) {
long start = Math.max(l, 3);
if (start <= r) {
count = r - start + 1;
}
} else if (k == 3) {
long start = Math.max(l, 6);
count = countMultiples(start, r, 3);
} else if (k == 4) {
long start = Math.max(l, 10);
count = countMultiples(start, r, 2);
if (start <= 12 && 12 <= r) {
count--;
}
} else if (k == 5) {
long start = Math.max(l, 15);
count = countMultiples(start, r, 5);
}
특정 구간의 특정 숫자의 배수의 갯수를 구하기 위해서 (오른쪽 / 특정 숫자 - (왼쪽 - 1)/ 특정 숫자) 를 계산한다.
private static long countMultiples(long L, long R, long m) {
if (L > R) {
return 0;
}
return (R / m) - ((L - 1) / m);
}
결과 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 등차수열의합1419 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long l = Long.parseLong(br.readLine()), r = Long.parseLong(br.readLine());
long k = Long.parseLong(br.readLine());
br.close();
long count = 0;
if (k == 2) {
long start = Math.max(l, 3);
if (start <= r) {
count = r - start + 1;
}
} else if (k == 3) {
long start = Math.max(l, 6);
count = countMultiples(start, r, 3);
} else if (k == 4) {
long start = Math.max(l, 10);
count = countMultiples(start, r, 2);
if (start <= 12 && 12 <= r) {
count--;
}
} else if (k == 5) {
long start = Math.max(l, 15);
count = countMultiples(start, r, 5);
}
System.out.print(count);
}
private static long countMultiples(long L, long R, long m) {
if (L > R) {
return 0;
}
return (R / m) - ((L - 1) / m);
}
}