문제
풀이

💡Idea

간단한 투 포인터 문제.

🔑Code

#include <bits/stdc++.h>
using namespace std;

int arr[10'000];
int N, M, ans = 0;

int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> M;
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
	}

	int st = 0, en = 0, sum = 0;
	while (st<=en) {
		while (sum < M && en < N) {
			sum	 += arr[en++];
		}
		if (sum == M) ans++;
		sum	 -= arr[st++];
	}
	cout << ans;

    return 0;
}

🗨️ Side Notes

투 포인터 문제를 처음 접근하며 풀이를 궁리했을 때, 바깥 반복문에서는 st를 밀고, 안쪽 반복문en를 미는 식으로 구현했었다. 일단 en을 최대한 밀어보고, 막혔을 때 st를 하나 밀고 다시 en을 밀어보는 느낌이다. 그래서인지 늘 투 포인터 문제를 만나면 그런 식으로 짜게 되더라. 다른 사람들 풀이를 보면, 하나의 반복문에 if문으로 st를 미는 경우와 en를 미는 경우를 구분하더라.

  • while (st<=en) {
      while (조건1 && en < N) {
          en++;
      }
      if(조건2) s++;
    }
    
  • 내가 생각하는 다른 사람들이 주로 짜는 방식
    while (st<=en && en < N) {
      if(조건1){
          st++;
      }
      else if(조건2) {
          en++;
      }
    }
    

    실제로 사람들이 저렇게들 많이 짜는지는 사실 나도 잘 몰루