algorithm/baekjoon 문제

[백준 10986] 나머지 합

장경훈 2022. 12. 13. 14:51
  # 백준 10986번 문제검색 링크

수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오.
www.acmicpc.net

 

Key Point

  • (A+B)%C는 ((A%C)+(B%C))%C와 동일하다 결국 이 말은 특정 구간의 나머지 연산을 더해 구한 값과 구간합의 나머지 연산의 결과는 동일하다는 것이다
  • 합배열 (sum[j]-sum[i])%M 은 결국 sum[j]%M - sum[i]%M과 동일함으로 결국 sum[j]%M=sum[i]%M의 결과가 나오게 된다 즉 합배열간 나머지가 동일한 것의 조합을 더해주면 된다.
  • 기본적으로 구간합이 나머지가 0인경우도 더해준다

 

문제 코드

 

import sys
input=sys.stdin.readline

N, M= map(int,input().split())

numbers=list(map(int, input().split()))
sum_array=[0]
answer=0
chk=[0]*M #같은 나머지수 카운트를 위한 배열 

for i in numbers: #합배열 만들기
    tmp=sum_array[-1]
    sum_array.append(tmp+i)
    
del sum_array[0] #첫번째는 임의로 0으로 만들었기 때문에 삭제

for i in sum_array: #기본적으로 나머지가 0인 합배열 더해주고 같은 나머지수 카운트
    if i%M == 0:
        answer+=1
    chk[i%M]+=1
    
for i in range(M): #같은 나머지수끼리 조합하여 계산
    if chk[i]>1:
        answer+=chk[i]*(chk[i]-1)//2
    
    
print(answer)

'algorithm > baekjoon 문제' 카테고리의 다른 글

[백준 11003번] 최솟값 찾기  (0) 2022.12.15
[백준1253번] 좋다  (0) 2022.12.15
[백준 11660] 구간 합 구하기 5  (0) 2022.12.12
[백준 11659]구간 합 구하기4  (0) 2022.12.12
등수 매기기[2012번]  (0) 2022.07.10