본문 바로가기

알고리즘/분류

[이진탐색 알고리즘] , [투 포인터스 알고리즘] 차이

[이분탐색 알고리즘 : https://ledgku.tistory.com/35]

[탐색 알고리즘] 이진 탐색 알고리즘(Binary Search)

[탐색 알고리즘] 이진 탐색 알고리즘(Binary Search) 이진 탐색 알고리즘 이진 탐색 알고리즘을 위해서는 데이터가 정렬되어 있어야 한다. 이진 탐색 알고리즘은 정렬된 데이터가 아니면 적용이 불��

ledgku.tistory.com

[이진탐색 대표문제]
https://www.acmicpc.net/problem/1920

1920번: 수 찾기

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안��

www.acmicpc.net

#include <iostream>
#include <algorithm>
using namespace std;

int arr[100001];

int sol(int len, int search) {
	int start = 0;
	int end = len - 1;

	while (end - start >= 0) {
		int mid = (start + end) / 2;

		if (arr[mid] == search) {
			cout << 1 << "\n";
			return 0;
		}
		else if (arr[mid] > search) {
			end = mid - 1;
		}
		else {
			start = mid + 1;
		}
	}

	cout << 0 << "\n";
	return 0;
}

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

	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> arr[i];
	}
	sort(arr, arr + n);

	int m;
	cin >> m;
	for (int i = 0; i < m; ++i) {
		int tmp;
		cin >> tmp;
		sol(n, tmp);
	}
}




[투 포인터스 알고리즘 : https://naivep.tistory.com/52]

투 포인터스 알고리즘 (Two Pointers Algorithm)

투 포인터스 알고리즘 (Two Pointers Algorithm) 절대 정답이 되지 않는 경우를 Skip하는 알고리즘. 보통 a부터 b까지의 합이 ~되는 경우를 묻는 문제에서 이중 포문을 사용해야하는데 경과되는 시간을 ��

naivep.tistory.com

투 포인터 알고리즘 - 1차원 배열에서 연속되는 값들을 이용해서(정렬X) 문제를 해결해야할 때 두 개의 포인터를 이용해 원하는 결과를 얻는 알고리즘

[투 포인터스 대표문제]
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

#include 
using namespace std;
const int M = 10000 + 1;

int arr[M];

int main() {
	int n, s;
	cin >> n >> s;

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

	int l = 0;
	int r = 0;
	int sum = 0;
	int cnt = 0;
	while (l <= r && r <= n) {
		if (sum >= s) {//현재sum이 크다면 l++
			if (sum == s) {
				cnt++;
			}
			sum -= arr[l];
			l++;
		}
		else {//현재sum이 작다면 r++
			sum += arr[r];
			r++;
		}
	}

	cout << cnt << endl;
}






['이진탐색'과 '투 포인터' 차이]
01.
이진탐색은 log n을 보장하고, 투포인터는 최악의 경우 n 이라고 할 수 있습니다.

02.
이진탐색은 mid를 활용해서 매 연산마다 탐색하는 범위를 절반으로 좁혀나가는
반면에 투포인터는 양끝단에서 한칸씩 이동하면서 알맞는 값을 찾는 식으로 쓰이죠. left와 right가 중간 어디서 만날때까지 계속 탐색을 하게 될거구요.

03.
이진탐색의 경우 탐색 대상 데이터가 정렬되어있다는 가정하에 탐색을 하게 됩니다. 투 포인터는 그런 제약이 없죠. (필요할때도 있겠지만)

'알고리즘 > 분류' 카테고리의 다른 글

완전탐색  (0) 2020.02.28
LC"S"  (0) 2020.02.25
[에라토스테네스의 체] 나의 기본형  (0) 2020.02.06
에라토스테네의 체 //주석에 유념  (0) 2020.02.05
세그먼트 트리  (0) 2020.02.04