Skip to content

Commit bf196ae

Browse files
committed
[Gold III] Title: 나눌 수 있는 부분 수열, Time: 236 ms, Memory: 92304 KB -BaekjoonHub
1 parent c4423f2 commit bf196ae

2 files changed

Lines changed: 70 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# [Gold III] 나눌 수 있는 부분 수열 - 3673
2+
3+
[문제 링크](https://www.acmicpc.net/problem/3673)
4+
5+
### 성능 요약
6+
7+
메모리: 92304 KB, 시간: 236 ms
8+
9+
### 분류
10+
11+
수학, 누적 합
12+
13+
### 제출 일자
14+
15+
2026년 2월 8일 23:14:09
16+
17+
### 문제 설명
18+
19+
<p>
20+
양의 정수로 이루어진 수열이 주어졌을 때, 연속하는 부분 수열의 합이 d로 나누어 떨어지는 것의 개수를 구하는 프로그램을 작성하시오.</p>
21+
22+
<p>
23+
예를 들어, 아래와 같은 수열의 부분 수열 중 4로 나누어 떨어지는 것의 개수는 6개이다.</p>
24+
25+
<p>
26+
2, 1, 2, 1, 1, 2, 1, 2</p>
27+
28+
<p>
29+
다음과 같은 부분 수열은 합이 4로 나누어 떨어진다. 1~8, 2~4, 2~7, 3~5, 4~6, 5~7번째</p>
30+
31+
### 입력
32+
33+
<p>
34+
첫째 줄에 테스트 케이스의 개수 c가 주어진다. (1 ≤ c ≤ 200) 각 테스트 케이스는 두 줄로 이루어져 있다.</p>
35+
36+
<p>
37+
테스트 케이스의 첫째 줄에는 d(1 ≤ d ≤ 1,000,000)와 수열의 크기 n(1 ≤ n ≤ 50,000)이 주어진다. 다음 줄에는 수열의 원소가 주어진다. 각 숫자는 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 정수이다.</p>
38+
39+
### 출력
40+
41+
<p>
42+
각 테스트 케이스에 대해서, 주어진 수열의 연속하는 부분 수열의 합이 d로 나누어 떨어지는 것의 개수를 출력한다.</p>
43+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Foundation
2+
3+
let T = Int(readLine()!)!
4+
5+
for _ in 0..<T {
6+
let DN = readLine()!.split { $0 == " " }.map { Int(String($0))! },
7+
D = DN[0],
8+
N = DN[1]
9+
10+
var answer = 0
11+
var remainderList = [Int](repeating: 0, count: D)
12+
let arr = readLine()!.split { $0 == " " }.map { Int(String($0))! }
13+
remainderList[0] = 1
14+
15+
var sum = 0
16+
for element in arr {
17+
sum = (sum + element) % D
18+
remainderList[sum] += 1
19+
}
20+
21+
for i in 0..<D {
22+
var count = remainderList[i]
23+
guard count >= 2 else { continue }
24+
answer += (count * (count - 1)) / 2
25+
}
26+
print(answer)
27+
}

0 commit comments

Comments
 (0)