티스토리 뷰
이 문제는 누적 합을 응용해 나머지가 0 인 구간의 개수를 구하는 문제이다.
어떻게 풀어야 하나 해서 검색도 하고 고민.. 항상 느끼지만 기본적인 수학 지식이 있으면 좋을 거 같다 ㅎ..
누적 합 이란
A [0] + A [1] +... A [i]+..+A [j]+...+A [n]의 숫자에서 A [i]부터 A [j]까지의 합을 구하는걸 미리 합 해놓은 S [] 배열로 구하는 문제이다. -> i~j까지의 합 = s [j]-s [i-1];
문제풀이
즉, 누적 합의 나머지가 같은 i, j끼리 조합하여 구간을 만들면 그것이 답의 개수가 된다!
만약 s [1]% m==0 && s [3]% m==0 이면 구간 1~3까지가 하나의 답이 되고,
s [2]% m==1 && s [5]% m==1 이면 구간 2~5까지가 또 다른 답이 되는 것이다.
1.누적 합의 나머지가 같은 것의 개수를 센다2. 그 개수로 조합을 만든다 -> 1-3 3-1구간이 같으므로 순서 x 이므로3. 조합은 중복의 경우가 안되므로 s [i] 자체로 나머지가 0이면, 즉 s [i]% m==0이면 바로 답++해준다.
※ 조합식
n개중에 r개를 뽑는 조합
nCr = nPr/r! = n!/(r!(n-r)!)
#참고로 알고리즘의 크기를 잡을 때 항상 최대 값을 고려하자 ㅎ
소스코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//누적합 나머지 합
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());
long ans = 0;
long[] mod = new long[(int)m];
long[] sumArr = new long[n+1];
st = new StringTokenizer(br.readLine());
for(int i=1;i<=n;i++) {
long num = Long.parseLong(st.nextToken());
//i인덱스까지의 누적합을 구해서 저장
sumArr[i]=sumArr[i-1]+num;
//누적합의 나머지가 0이라면 바로 답++
if(sumArr[i]%m==0) ans++;
//같은 나머지끼리 몇개인지 저장
mod[(int) (sumArr[i]%m)]+=1;
}
//같은 나머지 개수로 조합을 구하여 답에 추가한다
for(int i=0;i<m;i++) {
ans += mod[i]*(mod[i]-1)/2;
}
System.out.println(ans);
}
}
'CS공부 > 알고리즘&문제풀이' 카테고리의 다른 글
[백준 17136] 색종이 붙이기(java) (0) | 2021.04.15 |
---|---|
[프로그래머스]2017카카오코드 본선 : 단체사진 찍기(java) (0) | 2021.02.18 |
[백준 9466] 텀 프로젝트 (java) (0) | 2021.02.10 |
[백준 9663] N-Queen (java) (0) | 2021.02.09 |
[팰린드롬 문제] 프로그래머스,백준 풀이-Manacher's 알고리즘 (0) | 2021.02.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Stomp
- Oracle
- 알고리즘
- git
- JavaScript
- 프로그래머스
- sockjs
- 분리 집합
- Spring
- programers
- MST
- 코딩테스트
- 최소 스패닝 트리
- websocket
- 백준
- dfs
- java
- DP
- 삼성 sw역량 테스트
- 운영체제
- Baekjoon
- 완전탐색
- SWEA
- 삼성 sw역량테스트
- 정렬
- BFS
- 자바
- OS
- Heap
- 채팅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함