[백준, BOJ 3673] 나눌 수 있는 부분 수열 (java)
Problem Solving/BOJ

[백준, BOJ 3673] 나눌 수 있는 부분 수열 (java)

728x90

https://www.acmicpc.net/problem/3673

 

3673번: 나눌 수 있는 부분 수열

양의 정수로 이루어진 수열이 주어졌을 때, 연속하는 부분 수열의 합이 d로 나누어 떨어지는 것의 개수를 구하는 프로그램을 작성하시오. 예를 들어, 아래와 같은 수열의 부분 수열 중 4로 나누

www.acmicpc.net

728x90

메모리: 121,256 KB , 시간: 792  ms

사용 알고리즘: 수학, 누적 합

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder answer = new StringBuilder();

        int c = Integer.parseInt(br.readLine());

        int d, n, sum, tmp, result;
        Map<Integer, Integer> map;
        for (int tc = 0; tc < c; tc++) {
            st = new StringTokenizer(br.readLine());
            d = Integer.parseInt(st.nextToken());
            n = Integer.parseInt(st.nextToken());

            map = new HashMap<>();

            sum = 0;
            result = 0;

            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < n; i++) {
                sum += Integer.parseInt(st.nextToken());
                sum %= d;

                tmp = map.getOrDefault(sum, 0);
                result += tmp;
                if(sum % d == 0) result++;
                map.put(sum, tmp + 1);
            }

            answer.append(result + "\n");
        }

        System.out.println(answer);
    }
}
728x90