코딩 테스트 정복기/백준

[백준/Gold III] 나머지 합 - 10986

settong 2024. 10. 19. 18:45
반응형

[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
반응형