2003번: 수들의 합 2
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
www.acmicpc.net
아이디어:
투 포인트로 구현하면 되고, 대충 로직은 강의 들으면서 이해했는데 구현 과정에서 애를 먹었다. 이래서 어설프게 알면 안돼..ㅠㅠ
left, right 포인터를 0, 0 으로 초기화하고 합result와 출력할 답 ans 도 0으로 초기화한다.
무한루프를 돌면서 합이 m보다 클 경우에는 합을 줄여야 하므로 result에서 arr[left]값을 빼고 left++한다.
그리고 합이 m보다 같거나 작을 경우에는 합을 키워야 하므로(여기서 합이 m이랑 같을 경우에는 둘 중 어느 경우에 넣어도 상관이 없다.) result에 arr[right]를 더하고 right++한다. -> 이부분이 헷갈렸는데, result를 처음에 0으로 초기화하고 시작했기 때문에 이렇게 구현해야 되는 것 같다.
import sys
n, m = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))
left, right = 0, 0
ans = 0
result = 0
while (True):
if (result > m):
result -= arr[left]
left+=1
elif (right == n): break
else:
result += arr[right]
right+=1
if (result == m):
ans+=1
print(ans)
'알고리즘💻 > 누적합&투포인터' 카테고리의 다른 글
BOJ 20002번: 사과나무 (0) | 2021.02.02 |
---|---|
BOJ 10025번: 게으른 백곰 (0) | 2021.02.01 |
BOJ 1253번: 좋다 (0) | 2021.01.29 |
BOJ 1484번: 다이어트 (0) | 2021.01.29 |
BOJ 11659번, 11660번: 구간 합 구하기 4, 5 (0) | 2021.01.28 |