본문 바로가기

카테고리 없음

[BOJ] 2003번 - 수들의 합 2

반응형


문제설명

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)
반응형