반응형
10986번: 나머지 합
수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j)
www.acmicpc.net
문제
수 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.util.Scanner;
public class Algorithm_005_나머지_합_구하기 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
//합 배열 생성
long[] S = new long[N];
//나머지를 카운트하는 배열 생성
long[] C = new long[M];
long answer = 0;
S[0] = sc.nextInt();
//이전의 인덱스에 입력한 값을 더해서 배열에 값 대입. for문의 수행 길이가 같다고 해서 합치면 안된다.(이전의 인덱스를 사용하기 때문)
for(int i = 1;i<N;i++)S[i]=S[i-1]+sc.nextInt();
for(int i = 0;i<N;i++){
//S배열( 합 배열 ) 의 모든 값들을 M과 나머지 연산.
int remainder = (int) (S[i] % M);
if(remainder==0)answer++;
C[remainder]++;
}
for(int i=0;i<M;i++){
if(C[i]>1)answer+=(C[i]*(C[i]-1)/2);
}
System.out.println(answer);
}
}
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
백준 1253번 좋은 수 (0) | 2023.01.18 |
---|---|
백준 1940번 주몽의 명령 (0) | 2023.01.10 |
백준 2018번 연속된 자연수의 합 구하기 (0) | 2023.01.09 |
백준 1546번 평균 구하기 (0) | 2023.01.09 |
백준 11720번 숫자의 합 구하기 (0) | 2023.01.09 |