반응형
[Gold III] 나머지 합 - 10986
성능 요약
메모리: 244256 KB, 시간: 752 ms
분류
수학, 누적 합
제출 일자
2024년 10월 14일 17:22:27
문제 설명
수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오.
즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다.
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 106, 2 ≤ M ≤ 103)
둘째 줄에 N개의 수 A1, A2, ..., AN이 주어진다. (0 ≤ Ai ≤ 109)
출력
첫째 줄에 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 출력한다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long m = Integer.parseInt(br.readLine().split(" ")[1]);
long[] arr = Arrays.stream(br.readLine().split(" ")).mapToLong(Long::parseLong).toArray();
Map<Long, Integer> map = new HashMap<>();
long sum = 0;
for(long n : arr) {
sum = (sum+n)%m;
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
long answer = 0, cnt;
for(long key : map.keySet()) {
cnt = map.get(key);
if(key == 0){cnt++;}
answer += cnt*(cnt-1)/2;
}
System.out.println(answer);
}
}
728x90
반응형
'코딩 테스트 정복기 > 백준' 카테고리의 다른 글
[백준/Gold V] 토마토 - 7576 (0) | 2024.10.20 |
---|---|
[백준/Gold V] 평범한 배낭 - 12865 (4) | 2024.10.20 |
[백준/Silver IV] ATM - 11399 (1) | 2024.10.18 |
[백준/Gold V] Z - 1074 (0) | 2024.10.16 |
[백준/Silver I] 쉬운 최단거리 - 14940 (0) | 2024.10.16 |