반응형
문제설명
https://www.acmicpc.net/problem/2003
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
사고과정
- 이중 for 문을 구현하면 시간초과 판정이 나기에 투 포인터를 활용해야 했다.(왼쪽 포인터, 오른쪽 포인터 하나씩)
- 부분 수열의 합이 m보다 작을때, 같을 때, 클 때를 나누어서 처리해주어야 한다. 작을 때는 오른쪽 포인터를 하나씩 늘려가면서 합을 갱신해주면 되고 크거나 같을 때는 왼쪽 포인터에 있는 값을 합에서 빼주고 왼쪽 포인터 인덱스를 하나 늘려주어야 한다.
- 그리고 무한 루프를 빠져나오는 조건을 오른쪽 포인터가 주어진 수열의 마지막 인덱스보다 커지게 되면 break 해야 한다.
- 왼쪽 포인터에 있는 값을 합에서 빼주어야 한다는 점을 캐치 못하고 구현하지 못했드아..
풀이(스스로 못 푼 풀이)
n, m = map(int, input().split())
a = list(map(int, input().split()))
lt = 0
rt = 1
tot = a[0]
cnt = 0
while True:
if tot < m:
if rt < n:
tot += a[rt]
rt += 1
else:
break
elif tot == m:
cnt += 1
tot -= a[lt]
lt += 1
else:
tot -= a[lt]
lt += 1
print(cnt)
반응형