문제:
N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력:
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
출력:
첫째 줄에 경우의 수를 출력한다.
풀이방법:
포인터 두 개를 활용해서 해결할 수 있는 문제다. start와 end 포인터 두 개를 만든다. start가 문제의 i를 의미하고, j가 문제의 j를 의미하게 된다.
이 두 포인터를 사용해서 구간 합을 얻고, 이 구간 합이 원하는 값 M보다 작다면 end 포인터를 증가시켜서 구간 합이 커지도록 한다. 만약 M보다 크거나 같다면, start 포인터를 증가시켜서 구간 합이 작아지도록 한다.
두 포인터의 이동이 종료되는 조건은 end 포인터가 N이 될 때(IndexError가 발생하지 않게 하기 위함), 혹은 start 포인터가 end 포인터를 앞지를 때 종료하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
n,m = map(int,input().split())
numbers = list(map(int,input().split()))
answer = 0
start,end = 0,0
summation = 0
while True:
if summation<m:
if end==n:
break
summation+=numbers[end]
end+=1
else:
summation-=numbers[start]
start+=1
if start>end:
break
if summation==m:
answer+=1
print(answer)
|
cs |
문제링크:
'Algorithm > Python' 카테고리의 다른 글
[BOJ]1715. 카드 정렬하기 (0) | 2021.01.28 |
---|---|
[BOJ]2529. 부등호 (0) | 2021.01.26 |
[BOJ]2661. 좋은 수열 (0) | 2021.01.14 |
[BOJ]15711. 환상의 짝꿍 (0) | 2021.01.12 |
[BOJ]14938. 서강그라운드 (0) | 2021.01.07 |