728x90
반응형
🔗 문제 링크
https://www.acmicpc.net/problem/10986
10986번: 나머지 합
수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j)
www.acmicpc.net
👩💻 코드
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
int M;
cin >> N >> M;
vector<long> S(N, 0);
vector<long> C(M, 0);
cin >> S[0];
long answer = 0;
for (int i=1; i<N; i++){
int n = 0;
cin >> n;
S[i] = S[i-1] + n;
}
for (int i=0; i<N; i++){
int remainder = S[i] % M;
if (remainder == 0){
answer++;
}
C[remainder]++;
}
for (int i=0; i<M; i++){
if(C[i] > 1){
answer = answer + (C[i] * (C[i] -1) / 2);
}
}
cout << answer << "\n";
}
✏️ 풀이
구간 합 배열(S)를 구한 후 M으로 나눈 후 나머지 배열(C)을 만들면 쉬운 문제라고 생각했다.
하지만 나는 나머지가 0인 경우의 수만 생각했다.
S[j] % M의 값과 S[i] % M의 값이 같다면 (S[j] - S[i] ) % M은 0이다.
이 경우의 수를 놓쳤다.

나머지가 0으로 같은 인덱스의 수는 [1,2],[1,4],[2,4]로 3가지 경우가 나오고,
나머지가 1로 같은 인덱스의 수는 [0,3]으로 1가지 경우가 나온다.
인덱스의 수 중 2개의 숫자를 뽑는 경우의 수로 즉, 3C2와 3C2이다.
고등학교 시절에 배운 경우의 수가 어렴풋이 생각나서 수식을 구현하는건 어렵지 않았다.
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 1940번 : 주몽 (0) | 2024.03.02 |
---|---|
[백준] 2018번 : 수들의 합 5 (2) | 2024.02.29 |
[백준] 11660번 : 구간 합 구하기 5 (1) | 2024.02.06 |
[백준] 11659번 : 구간 합 구하기 4 (0) | 2024.02.01 |
[백준] 1546번 : 평균 (0) | 2024.02.01 |