문제 해석
int[] preSum = new int[x]; //누적합을 구할 배열
int[] number = new int[x]; //입력받은 숫자
for(int i = 1; i <= x; i++){
sum += arr[i-1] + number[i]
}
int[] sum = new int[x+1];
for (int i = 0; i < x; i++) {
answer[i] = arr[b] - arr[a-1];
}
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); //숫자의 개수
int M = Integer.parseInt(st.nextToken()); //나누는 수
st = new StringTokenizer(br.readLine());
int[] count;
//입력과 동시에 누적합 구하기
count = new int[M]; //나머지 종류별로
int sum = 0; //누적합
for(int i = 0; i < N; i++){
int number = Integer.parseInt(st.nextToken());
sum = (sum+num)%number; //누적합하여 M으로 나눈 나머지(인덱스 값이 됨)
count[sum]++;
}
long cnt = count[0]; //자기 스스로 나머지가 0이 나오는 경우
for(int i = 0; i < count.length; i++){
//조합으로 나머지가 0이 나오는 경우
cnt += (long)count[i] * (count[i]-1)/2; //10^6 * 10^6임으로 overflow 방지로 long형으로
}
System.out.println(cnt);
}
}
결과
느낀 점
이해하는 데 진짜 오래걸린 문제이다. 일단 처음 시작자체를 못해서 다른 분들의 아이디어를 참고했는데 참고해도 이해를 못해서 꽤 걸렸던 문제이다.
다행히 문제를 보면 볼수록 서서히 이해가 되어서 풀 수 있었다.