[C++] 이뢄 탐색(Binary Search)

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

이뢄 탐색(Binary Search)

μ„ ν˜• μžλ£Œκ΅¬μ‘°κ°€ μ •λ ¬λ˜μ–΄ μžˆμ„ λ•Œ νŠΉμ •ν•œ 값을 λΉ λ₯΄κ²Œ μ°ΎλŠ” 방법이닀.

 

이뢄 탐색(O(logN)) vs μ„ ν˜• 탐색(O(N))

 

문제

 

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μ•ˆμ— μ‘΄μž¬ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄λ©΄ λœλ‹€. λͺ¨λ“  μ •μˆ˜μ˜ λ²”μœ„λŠ” -231 보닀 ν¬κ±°λ‚˜ κ°™κ³  231보닀 μž‘λ‹€.

www.acmicpc.net

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

int main()
{
	int N, M;
	int a[100000];

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

	sort(a, a + N);

	for (int i = 0; i < M; ++i) {
		int target;
		cin >> target;

		int start = 0, end = N - 1, mid;
		while (start <= end) {
			mid = (start + end) / 2;

			if (target == a[mid]) {
				cout << "1\n";
				break;
			}
			else if (target > a[mid])
				start = mid + 1;
			else if (target < a[mid])
				end = mid - 1;
		}

		if (start > end)
			cout << "0\n";
	}
}

 

https://leetcode.com/problems/search-in-rotated-sorted-array/submissions/

 

Search in Rotated Sorted Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

#include <vector>
using namespace std;

class Solution {
public:
    int search(vector<int>& nums, int target)
    {
        int left = 0, right = nums.size() - 1;

        while (left <= right)
        {
            int mid = left + (right - left) / 2;

            if (nums[mid] == target)
                return mid;
            else if (nums[left] <= nums[mid]) // midλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½κ³Ό 였λ₯Έμͺ½ 쀑 μ •λ ¬λœ λΆ€λΆ„μ—μ„œ 확인
            {
                if (nums[left] <= target && target < nums[mid])
                    right = mid - 1;
                else
                    left = mid + 1;
            }
            else
            {
                if (nums[mid] < target && target <= nums[right])
                    left = mid + 1;
                else
                    right = mid - 1;
            }
        }

        return -1;
    }
};

 

https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/

 

Find First and Last Position of Element in Sorted Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

#include <vector>
using namespace std;

class Solution
{
public:
    vector<int> searchRange(vector<int> &nums, int target)
    {
        vector<int> answer;
        int start = 0, end = nums.size() - 1;
        while (start <= end)
        {
            if (nums[start] == target && nums[end] == target)
            {
                answer.push_back(start);
                answer.push_back(end);
                break;
            }
            else if (nums[start] < target)
                start++;
            else
                end--;
        }

        if (answer.empty())
        {
            answer.push_back(-1);
            answer.push_back(-1);
        }

        return answer;
    }
};

 

문제 : νŒŒλΌλ©”νŠΈλ¦­ μ„œμΉ˜(Parametric Search)

이뢄 탐색을 μ‘μš©ν•˜μ—¬ μ΅œμ†Ÿκ°’μ΄λ‚˜ μ΅œλŒ“κ°’μ„ μ°ΎλŠ” λ¬Έμ œμ΄λ‹€.

 

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

 

1654번: λžœμ„  자λ₯΄κΈ°

첫째 μ€„μ—λŠ” μ˜€μ˜μ‹μ΄ 이미 κ°€μ§€κ³  μžˆλŠ” λžœμ„ μ˜ 개수 K, 그리고 ν•„μš”ν•œ λžœμ„ μ˜ 개수 N이 μž…λ ₯λœλ‹€. KλŠ” 1이상 10,000μ΄ν•˜μ˜ μ •μˆ˜μ΄κ³ , N은 1이상 1,000,000μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. 그리고 항상 K ≦ N 이닀. κ·Έ ν›„ K쀄에 걸쳐 이미 κ°€μ§€κ³  μžˆλŠ” 각 λžœμ„ μ˜ 길이가 μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ μ •μˆ˜λ‘œ μž…λ ₯λœλ‹€. λžœμ„ μ˜ κΈΈμ΄λŠ” 231-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

www.acmicpc.net

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

int main()
{
	int K, N;
	long long LAN[10000];

	cin >> K >> N;
	for (int i = 0; i < K; ++i)
		cin >> LAN[i];

	long long start = 1, end = *max_element(LAN, LAN + K), mid;
	while (start <= end) {
		mid = (start + end) / 2;

		long long cnt = 0;
		for (int i = 0; i < K; ++i)
			cnt += LAN[i] / mid;

		if (cnt >= N)
			start = mid + 1;
		else
			end = mid - 1;
	}
	cout << end;
}

 

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

 

1300번: K번째 수

μ„Έμ€€μ΄λŠ” 크기가 N×N인 λ°°μ—΄ Aλ₯Ό λ§Œλ“€μ—ˆλ‹€. 배열에 λ“€μ–΄μžˆλŠ” 수 A[i][j] = i×j 이닀. 이 수λ₯Ό 일차원 λ°°μ—΄ B에 λ„£μœΌλ©΄ B의 ν¬κΈ°λŠ” N×N이 λœλ‹€. Bλ₯Ό μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν–ˆμ„ λ•Œ, B[k]λ₯Ό κ΅¬ν•΄λ³΄μž. λ°°μ—΄ A와 B의 μΈλ±μŠ€λŠ” 1λΆ€ν„° μ‹œμž‘ν•œλ‹€.

www.acmicpc.net

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

int main()
{
	int N, K;
	cin >> N >> K;

	int start = 1, end = K, mid;
	while (start <= end) {
		mid = (start + end) / 2;

		int cnt = 0;
		for (int i = 1; i <= N; ++i)
			cnt += min(N, mid / i);

		if (cnt >= K)
			end = mid - 1;
		else
			start = mid + 1;
	}
	cout << start;
}

 

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

 

3079번: μž…κ΅­μ‹¬μ‚¬

문제 상근이와 μΉœκ΅¬λ“€μ€ μ˜€μŠ€νŠΈλ ˆμΌλ¦¬μ•„λ‘œ 여행을 떠났닀. 상근이와 μΉœκ΅¬λ“€μ€ 총 Mλͺ…이고, μ§€κΈˆ κ³΅ν•­μ—μ„œ ν•œ μ€„λ‘œ μ„œμ„œ μž…κ΅­μ‹¬μ‚¬λ₯Ό 기닀리고 μžˆλ‹€. μž…κ΅­μ‹¬μ‚¬λŒ€λŠ” 총 Nκ°œκ°€ μžˆλ‹€. 각 μž…κ΅­μ‹¬μ‚¬κ΄€οΏ½οΏ½

www.acmicpc.net

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

long long t[100000];

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

    long long start = 1, end = *max_element(t, t + N) * M, mid;
    while (start <= end) {
        mid = (start + end) / 2;

        long long num = 0;
        for (int i = 0; i < N; ++i)
            num += mid / t[i];

        if (num >= M)
            end = mid - 1;
        else
            start = mid + 1;
    }
    cout << start;
}

 

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

 

1939번: μ€‘λŸ‰μ œν•œ

첫째 쀄에 N, M(1≤M≤100,000)이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ M개의 μ€„μ—λŠ” 닀리에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ„Έ μ •μˆ˜ A, B(1≤A, B≤N), C(1≤C≤1,000,000,000)κ°€ μ£Όμ–΄μ§„λ‹€. μ΄λŠ” A번 섬과 B번 섬 사이에 μ€‘λŸ‰μ œν•œμ΄ C인 닀리

www.acmicpc.net

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

int N, M, V1, V2;
vector<pair<int, int>> graph[10001];

bool bfs(int mid)
{
	queue<int> q;
	bool ck[10001]{};

	q.push(V1);
	ck[V1] = true;
	while (!q.empty()) {
		int tv = q.front();
		if (tv == V2)
			return true;
		q.pop();

		for (int i = 0; i < graph[tv].size(); ++i) {
			int nv = graph[tv][i].first, nw = graph[tv][i].second;
			if (!ck[nv] && nw >= mid) {
				q.push(nv);
				ck[nv] = true;
			}
		}
	}
	return false;
}

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

	int start = 1e9, end = 0, mid = 0;
	for (int i = 0, A, B, C; i < M; ++i) {
		cin >> A >> B >> C;
		graph[A].push_back({ B,C });
		graph[B].push_back({ A,C });

		start = min(start, C);
		end = max(end, C);
	}
	cin >> V1 >> V2;

	while (start <= end) {
		mid = (start + end) / 2;

		if (bfs(mid))
			start = mid + 1;
		else
			end = mid - 1;
	}
	cout << end;
}

 

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

 

2585번: κ²½λΉ„ν–‰κΈ°

κ²½λΉ„ν–‰κΈ° λ…μˆ˜λ¦¬ν˜Έκ°€ μΆœλ°œμ§€ Sμ—μ„œ λͺ©μ μ§€ T둜 κ°€λŠ₯ν•œ λΉ λ₯Έ μ†λ„λ‘œ μ•ˆμ „ν•˜κ²Œ μ΄λ™ν•˜κ³ μž ν•œλ‹€. μ΄λ•Œ, κ²½λΉ„ν–‰κΈ°μ˜ μ—°λ£Œν†΅μ˜ 크기λ₯Ό μ •ν•˜λŠ” 것이 μ€‘μš”ν•œ λ¬Έμ œκ°€ λœλ‹€. 큰 μ—°λ£Œν†΅μ„ μž₯μ°©ν•˜λ©΄ 쀑간��

www.acmicpc.net

#include <iostream>
#include <queue>
#include <cmath>
using namespace std;

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

    pair<int, int> point[1002]{};
    for (int i = 1; i <= n; i++)
        cin >> point[i].first >> point[i].second;
    point[n + 1] = { 10000,10000 }; // λͺ©μ μ§€

    int start = 1, end = 15000, mid;
    while (start <= end) {
        mid = (start + end) / 2;

        bool flag = false;

        queue<pair<int, int>> q;
        q.push({ 0,0 }); // μΆœλ°œμ§€
        bool ck[1002]{};
        ck[0] = true;
        while (!q.empty()) {
            int tn = q.front().first;
            int tk = q.front().second;
            q.pop();

            if (tn == n + 1) {
                flag = true;
                break;
            }

            for (int i = 1; i <= n + 1; i++) {
                int dist = pow((point[tn].first - point[i].first), 2) + pow((point[tn].second - point[i].second), 2);
                if (!ck[i] && mid * mid > dist && tk <= k) {
                    ck[i] = true;
                    q.push({ i,tk + 1 });
                }
            }
        }

        if (flag)
            end = mid - 1;
        else
            start = mid + 1;
    }
    cout << start / 10 + (start % 10 ? 1 : 0);
}

 

문제 : μ‚ΌλΆ„ 탐색

 

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

 

8986번: μ „λ΄‡λŒ€

μž…λ ₯의 첫 쀄은 μ „λ΄‡λŒ€μ˜ 수 N (1 ≤ N ≤ 100,000)이 μ£Όμ–΄μ§„λ‹€. 두 번째 μ€„μ—λŠ” μ „λ΄‡λŒ€μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” N개의 μ„œλ‘œ λ‹€λ₯Έ x-μ’Œν‘œ xi(i = 0, ..., N-1)κ°€ λΉˆμΉΈμ„ 사이에 두고 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ£Όμ–΄μ§„λ‹€. xiλŠ”

www.acmicpc.net

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

int N;
vector<long long> v;

long long Sum(long  long dist)
{
	long long sum = 0;
	for (int i = 0; i < N; ++i)
		sum += abs((i * dist) - v[i]);
	return sum;
}

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

	cin >> N;

	v.resize(N);
	for (int i = 0; i < N; ++i)
		cin >> v[i];

	long long start = 0, end = v[N - 1];
	while (start + 3 <= end) {
		long long mid1 = (start * 2 + end) / 3;
		long long mid2 = (start + end * 2) / 3;

		if (Sum(mid1) < Sum(mid2))
			end = mid2;
		else
			start = mid1;
	}

	long long ans = 1e18;
	for (int i = start; i <= end; ++i)
		ans = min(ans, Sum(i));
	cout << ans;
}
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Computer Science/✏ Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [C] 이진 탐색 트리(BST)
  • [C++] binary_search, lower_bound, upper_bound
  • [C++] λΆ„ν•  정볡(Divide and Conquer)
  • [C++] 그리디(Greedy)
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)
μƒλ‹¨μœΌλ‘œ

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