knowledge/algorithm

[ 알고리즘 ] 투포인터 ( Two Pointer )의 이해 및 구현

발효홍삼 2022. 3. 17. 03:26
728x90

투 포인터(Two Pointer)란?

  • 리스트에 순차적으로 접근해야 할 때 두 개의 점의 위치를 기록하면서 처리하는 알고리즘
  • 두 개의 포인터를 만들어 각각이 가리키는 원소에 의미를 부여해 요구하는 문제를 해결하는 알고리즘
  • 포인터 2개가 같은 방향으로 진행해 나가는 것 , 포인터 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

특정한 합을 가지는 부분연속수열의 개수 찾기

 

1 . 문제 해결 아이디어

  -1. start와 end가 첫번째 인덱스(0)을 가르킨다.

  -2. 현재 부분합이 m보다 작다면 end를 1 증가한다.

  -3. 현재 부분합이 m보다 크거나 같다면 start를 1 증가한다.

  -4. 2~3번 과정을 모든 경우를 확인할 때까지 반복한다.

 

#include <iostream>
#include <vector>

using namespace std;

int n, m, e, ans,nowSum; // n : 수열의 길이 , m : 원하는 합
int A[10001];

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	//input
	cin >> n >> m;

	for (int i = 0; i < n; i++)
		cin >> A[i];
	
	for (int start = 0; start < n; start++)
	{
		//end 이동
		while (nowSum < m && e < n)
		{
			nowSum += A[e];
			e++;
		}
		//부분합이 m
		if (nowSum == m)
			ans++;
		nowSum -= A[start]; //
	}

	//output
	cout << ans;
	return 0;
}

 

 

728x90