[C++] binary_search, lower_bound, upper_bound

2020. 4. 29. 18:37Β·πŸ“ Computer Science/✏ Algorithm

binary_search, lower_bound, upper_bound

μ •λ ¬λ˜μ–΄ μžˆλŠ” λ°°μ—΄, μ»¨ν…Œμ΄λ„ˆ 등을 λŒ€μƒμœΌλ‘œ νƒμƒ‰ν•œλ‹€.

  • binary_search: 탐색 λŒ€μƒμ΄ λ˜λŠ” 값이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κ³  λ“€μ–΄ μžˆλ‹€λ©΄ true, μ—†λ‹€λ©΄ falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • lower_bound: 찾고자 ν•˜λŠ” κ°’ 이상이 처음 λ‚˜νƒ€λ‚˜λŠ” μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • upper_bound: 찾고자 ν•˜λŠ” 값을 μ΄ˆκ³Όν•˜λŠ” 값이 처음 λ‚˜νƒ€λ‚˜λŠ” μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•œλ‹€.

 

 

lower_bound, upper_bound

 

문제

 

https://www.acmicpc.net/problem/12015

 

12015번: κ°€μž₯ κΈ΄ μ¦κ°€ν•˜λŠ” λΆ€λΆ„ μˆ˜μ—΄ 2

첫째 쀄에 μˆ˜μ—΄ A의 크기 N (1 ≤ N ≤ 1,000,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” μˆ˜μ—΄ Aλ₯Ό 이루고 μžˆλŠ” Aiκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ Ai ≤ 1,000,000)

www.acmicpc.net

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

int main(void)
{
	int N;
	cin >> N;

	vector<int> v;
	for (int i = 0; i < N; i++) {
		int n;
		cin >> n;

		auto iter = lower_bound(v.begin(), v.end(), n);
		if (iter == v.end())
			v.push_back(n);
		else
			*iter = n;
	}
	cout << v.size();
}

 

문제 : μ°Ύκ³ μž ν•˜λŠ” κ°’μ˜ 개수 κ΅¬ν•˜κΈ°

 

https://www.acmicpc.net/problem/10816

 

10816번: 숫자 μΉ΄λ“œ 2

첫째 쀄에 상근이가 κ°€μ§€κ³  μžˆλŠ” 숫자 μΉ΄λ“œμ˜ 개수 N(1 ≤ N ≤ 500,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 숫자 μΉ΄λ“œμ— μ ν˜€μžˆλŠ” μ •μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 숫자 μΉ΄λ“œμ— μ ν˜€μžˆλŠ” μˆ˜λŠ” -10,000,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 10,

www.acmicpc.net

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

int num[500001];

int main()
{
	int N;
	cin >> N;
	for (int i = 0; i < N; ++i)
		cin >> num[i];

	sort(num, num + N);

	int M, tmp;
	cin >> M;
	for (int i = 0; i < M; ++i) {
		cin >> tmp;
		cout << upper_bound(num, num + N, tmp) - lower_bound(num, num + N, tmp) << " "; // 개수 κ΅¬ν•˜κΈ°
	}
}

 

https://www.acmicpc.net/problem/7453

 

7453번: 합이 0인 λ„€ μ •μˆ˜

문제 μ •μˆ˜λ‘œ 이루어진 크기가 같은 λ°°μ—΄ A, B, C, Dκ°€ μžˆλ‹€. A[a], B[b], C[c], D[d]의 ν•©μ΄ 0인 (a, b, c, d) 쌍의 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μž…λ ₯ 첫째 쀄에 λ°°μ—΄μ˜ 크기 n (1 ≤ n ≤ 4000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ n개 μ€„μ—λŠ” A, B, C, D에 ν¬ν•¨λ˜λŠ” μ •μˆ˜κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄μ Έμ„œ μ£Όμ–΄μ§„λ‹€. 배열에 λ“€μ–΄μžˆλŠ” μ •μˆ˜μ˜ μ ˆλŒ“κ°’μ€ μ΅œλŒ€ 228이닀. 좜λ ₯ 합이 0이 λ˜λŠ” 쌍의 개수λ₯Ό 좜λ ₯ν•œλ‹€. 예제 μž…λ ₯ 1 볡

www.acmicpc.net

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

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

	int n;
	cin >> n;

	vector<int> A(n), B(n), C(n), D(n);
	for (int i = 0; i < n; i++)
		cin >> A[i] >> B[i] >> C[i] >> D[i];

	vector<int> sumA, sumB;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			sumA.push_back(A[i] + B[j]);
			sumB.push_back(C[i] + D[j]);
		}

	sort(sumA.begin(), sumA.end());
	sort(sumB.begin(), sumB.end());

	long long ans = 0;
	for (int i = 0; i < sumA.size(); i++)
		ans += upper_bound(sumB.begin(), sumB.end(), -sumA[i]) - lower_bound(sumB.begin(), sumB.end(), -sumA[i]);
	cout << ans;
	return 0;
}
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Computer Science/✏ Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [C++] μŠ€νƒ(Stack)
  • [C] 이진 탐색 트리(BST)
  • [C++] 이뢄 탐색(Binary Search)
  • [C++] λΆ„ν•  정볡(Divide and Conquer)
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[C++] binary_search, lower_bound, upper_bound
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”