본문 바로가기
알고리즘 문제풀이

[백준 10816] 알고리즘 54일차 : 숫자 카드 2

by SiO2whocode 2020. 12. 28.
728x90

www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

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

www.acmicpc.net

이분탐색 C++

입력받은 숫자배열에 또 다른 배열에 주어진 숫자들이 몇개씩 포함되어있는지 출력하는 문제 (이과생의 글솜씨 ㅈㅅ)

숫자를 찾은 후에 숫자 개수를 하나씩 세어나가면 안된다. 이유는 모두 같은 수 일때는 결국 전체탐색을 하게 되기 때문.

그래서 lower_bound랑 upper_bound를 구해서 풀어야 하는 문젠데 구현 다 했는데 계속 시간초과 나서 찾아보니까

STL이 있었다. 그래서 써봤는데 그것도 안돼서

ios::sync_with_stdio(false);

cin.tie(0);

이 구문들 썼더니 바로 해결됐다.

그 후에 내가 구현한 함수들로 다시 제출하니까 그것도 시간초과 없이 통과됐다. (..^^)

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
int gotnum[500000];
int N;

int binarySearchS(int num){
    int s = 0;
    int e = N-1;
    int mid = (s+e)/2;
    while(e>=s){
        mid = (s+e)/2;
        if(gotnum[mid] == num && gotnum[mid-1] != num){
            return mid;
        }
        else if(gotnum[mid] >= num){
            e = mid-1;
        }
        else{
            s = mid+1;
        }
    }
    return N;
}
int binarySearchE(int num){
    int s = 0;
    int e = N-1;
    int mid = (s+e)/2;
    while(e>=s){
        mid = (s+e)/2;
        if(gotnum[mid] == num && gotnum[mid+1] != num){
            return mid;
        }
        else if(gotnum[mid] <= num){
            s = mid+1;
        }
        else{
            e = mid-1;
        }
    }
    return -1;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin >> N;
    for(int i = 0 ; i < N ; i++){
        cin >> gotnum[i];
    }
    sort(gotnum, gotnum+N);
    
    int M;
    cin >> M;
    
    int setnum,cnt;
    for(int i = 0 ; i < M ; i++){
        cin >> setnum;
        cnt = binarySearchE(setnum)-binarySearchS(setnum)+1;
        if(cnt < 0)
            cnt = 0;
        cout << cnt << " ";
    }
    return 0;
}

코드 좀 지저분한거 아는데 지금 이거에 시간을 너무 쓴 것 같아서 넘어갈게요..

728x90