[Baekjoon] 2003. 数の和2[S 3]


📚 質問する


https://www.acmicpc.net/problem/2003
これは二重ポインタの問題です.ダブルポインタs,eが一緒に出発する問題を解いた.
sとeのゼロインデックスからsからeへの数列の和を比較し、eが配列を超えた場合、重複文を終了します。 和がMに等しい場合の数は,cntが1増加し,eが1格子移動することに等しい.(s,eのいずれかは移動可能で、両方とも移動可能!) 和がMより小さい場合、eグリッドを移動して和を増加させ、Mより大きい場合、sを移動して和を減少させる。 sがeを超える瞬間は0,eが正常動作を上回る.そのため、例外処理をしなくても大丈夫です。

上記のコードを実装すると、eグリッドを移動して合計すると、先頭インデックスにインデックスエラーが発生します.
したがって、[0]を横に含むパディングを使用して、所与の配列を解決する.

📒 コード#コード#

N, M = map(int, input().split())
# e가 1 더해지고 호출하니 배열을 넘칠 수 있다. 그래서 padding을 활용한다.
arr = list(map(int, input().split())) + [0] 
s = e = cnt = 0
sum = arr[0]
while e < N:    # e가 넘치면 종료
    if sum <= M:    # M보다 작거나 같을 때 e 증가, 같을 때는 s를 증가시키든 상관없다.(둘 다 증가시켜도 된다.)
        if sum == M:
            cnt += 1
        e += 1
        sum += arr[e]   # e가 배열을 넘어가면 한번 참조하긴 해야해서 위에 패딩을 넣어주었다.
    else:
        sum -= arr[s]
        s += 1
print(cnt)

🔍 結果