백준 - 나머지 합(10986)

유재우·2022년 8월 2일
0

코딩테스트 준비_개인

목록 보기
117/192

문제

수 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으로 나누어 떨어지는 구간의 개수를 출력한다.
  • 예제 입력 1
5 3
1 2 3 1 2
  • 예제 출력 1
7

  • 정답
import sys
input = sys.stdin.readline
n, m = map(int, input().split())  # n : 숫자 갯수, m : 나눌 수 
num = list(map(int, input().split())) + [0]  # 숫자 입력
r = [0] * m  # 누적합을 m으로 나눴을 때의 나머지가 index이고 그 값에 count
for i in range(n):
    num[i] += num[i - 1]  # 숫자 정보를 누적합으로 갱신
    r[num[i] % m] += 1  # 해당 누적합을 m으로 나눴을 때의 나머지에 해당하는 값에 1추가
cnt = r[0]  # 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수
for i in r:
    cnt += i * (i - 1) // 2
print(cnt)

참고한 블로그 링크

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글