백준문제풀이/이분탐색

10815번-숫자 카드

반응형

문제

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

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net


접근방법

1) 접근 사고

n의 카드들이 있을때 m의 카드들이 n의 카드들에도 있는지도 확인하면 되는 문제였습니다. 이진 탐색을 활용하면 쉽게 해결할 수 있는 문제 입니다.

 

2) 시간 복잡도

n과 m의 카드의 길이가 500,000이므로 완전탐색을 돌리면 25,000,000,000,000의 연산이 일어나므로 시간복잡도를 줄여야 하는 문제였습니다.

 

3) 배운 점

두 가지 방식으로 문제를 해결할 수 있다 생각했습니다. 첫 번째는 binary_search를 활용한 이진 탐색이고 두 번째는 lower_bound, upper_bound를 활용한 equal_lange를 사용해서 두 리턴값의 차이로 구하는 방법입니다. 두 방식으로 전부 구현해 보았습니다.

 

4) PS

paramatric search를 활용해서 풀어도 되진만 STL을 활용하면 더욱 코드가 간결해진다!


정답 코드

1.binary_search를 활용한 구현 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<bits/stdc++.h>
#define pill pair<int,int>
#define mp(X,Y) make_pair(X,Y)
 
using namespace std;
const int MAX = 1e7;
 
int n,m;
int arr[MAX];
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> n;
 
    for (int i = 0; i < n; i++)
        cin >> arr[i];
 
    sort(arr, arr + n);
 
    cin >> m;
 
    for (int i = 0; i < m; i++)
    {
        int num;
        cin >> num;
 
        if (binary_search(arr, arr + n, num))
            cout << 1 << "\n";
        else
            cout << 0 << "\n";
    }
 
    return 0;
}
 
 
cs

 

2.equal_range를 활용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<int,int>
#define mp(X,Y) make_pair(X,Y)
#define mt(X,Y) make_tuple(X,Y)
#define mtt(X,Y,Z) make_tuple(X,Y,Z)
#define ll long long
#define sz(v) (int)(v).size()
 
using namespace std;
const int MAX = 5e5 + 1;
int arr1[MAX];
int arr2[MAX];
 
int n, m;
int main(void)
{
    fastio;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> arr1[i];
    cin >> m;
    for(int j = 0; j < m; j++)
        cin >> arr2[j];
    sort(arr1, arr1 + MAX);
    for(int i = 0; i < m; i++)
    {
        auto[lo, hi] = equal_range(arr1, arr1 + MAX, arr2[i]);
        cout << hi - lo << "\n";
    }
}
 
cs
반응형

'백준문제풀이 > 이분탐색' 카테고리의 다른 글

10816번-숫자카드2  (2) 2021.08.11
7453번-합이 0인 네 정수  (0) 2021.08.10
1300번-K번째 수  (0) 2021.08.10
16434번-드래곤앤던전  (0) 2021.08.09
2110번-공유기설치  (0) 2021.08.09