https://www.acmicpc.net/problem/10986
📒 문제
수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오.
즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다.
시간 제한 / 메모리 제한
1초 / 256MB
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 106, 2 ≤ M ≤ 103)
둘째 줄에 N개의 수 A1, A2, ..., AN이 주어진다. (0 ≤ Ai ≤ 109)
출력
첫째 줄에 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 출력한다.
입출력 예
# 입력1
5 3
1 2 3 1 2
# 출력1
7
알고리즘 분류
- 수학
- 누적 합
💻 소스코드
import java.io.*;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 배열의 개수
int M = Integer.parseInt(st.nextToken()); // 나눌 수
long result = 0;
// 합 배열 생성
long[] arr= new long[N+1];
st = new StringTokenizer(br.readLine());
arr[1] = Integer.parseInt(st.nextToken());
for (int i = 2; i <= N; i++) {
arr[i] = arr[i - 1] + Integer.parseInt(st.nextToken());
}
// 배열 원소에 % M
long[] C = new long[M];
for (int i = 1; i <= N; i++) {
long r = arr[i] % M;
if(r == 0) result++;
C[(int) r]++;
}
for (int i = 0; i < M; i++) {
if(C[i] > 1) result += (C[i] * (C[i] - 1) / 2);
}
bw.write(String.valueOf(result));
bw.flush();
bw.close();
}
}
📝 풀이
[JAVA][알고리즘] 구간 합
구간 합은 합 배열을 이용하여 시간 복잡도를 더 줄이기 위해 사용하는 특수한 목적의 알고리즘 이다. 코딩 테스트에서 사용 빈도가 높기 때문에 알아두면 좋다. 구간 합은 누적합이라고도 하는
twd0622.tistory.com
[알고리즘] 나누기 연산의 분배 법칙
코딩 테스트에서 정답의 나머지 값을 요구하는 경우가 종종 있다. 이 문제에는 자료형의 표현 범위를 넘지 않게 유도하고 나머지 연산의 원리를 알고 있는지 묻는 의도가 담겨 있다.나머지 연산
twd0622.tistory.com
'코딩 테스트 > 백준 [JAVA]' 카테고리의 다른 글
| [JAVA][백준][S5] DNA 비밀번호 (0) | 2025.11.28 |
|---|---|
| [JAVA][백준][G4] 1253번 좋아 (0) | 2025.11.25 |
| [JAVA][백준][S4] 1940번 주몽 (0) | 2025.11.06 |
| [JAVA][백준][S5] 2018번 수들의 합 5 (0) | 2025.11.06 |
| [JAVA][백준][S1] 11660번 구간 합 구하기 5 (0) | 2025.10.24 |