Skip to content

Commit 57216b4

Browse files
committed
[Gold IV] Title: 부분합, Time: 44 ms, Memory: 76292 KB -BaekjoonHub
1 parent dc5a556 commit 57216b4

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# [Gold IV] 부분합 - 1806
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1806)
4+
5+
### 성능 요약
6+
7+
메모리: 76292 KB, 시간: 44 ms
8+
9+
### 분류
10+
11+
누적 합, 두 포인터
12+
13+
### 제출 일자
14+
15+
2025년 5월 9일 00:09:29
16+
17+
### 문제 설명
18+
19+
<p>10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.</p>
20+
21+
### 입력
22+
23+
<p>첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.</p>
24+
25+
### 출력
26+
27+
<p>첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.</p>
28+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
let ns = readLine()!.split { $0 == " " }.map { Int(String($0))! },
2+
n = ns[0],
3+
s = ns[1]
4+
let numberList = readLine()!.split { $0 == " " }.map { Int(String($0))! }
5+
var sumList = [0]
6+
for i in 0..<numberList.count {
7+
let curSum = sumList.last! + numberList[i]
8+
sumList.append(curSum)
9+
}
10+
11+
var start = 1
12+
var end = 1
13+
var answer = Int.max
14+
while true {
15+
if start >= sumList.count || end >= sumList.count { break }
16+
let curSum = sumList[end] - sumList[start-1]
17+
if curSum >= s {
18+
answer = min(answer, end - start + 1)
19+
start += 1
20+
continue
21+
}
22+
end += 1
23+
}
24+
print(answer == Int.max ? 0 : answer)

0 commit comments

Comments
 (0)