문제 풀이/BOJ 문제 풀이

[BOJ알고리즘, C++]#10816_숫자 카드2, lower_bound, upper_bound

Hardii2 2022. 9. 25. 18:29

 

[BOJ 알고리즘, C++] #10816_숫자 카드 2, lower_bound, upper_bound

 

BOJ 알고리즘 문제 풀이, 10816_숫자 카드2

정렬 알고리즘을 통해 주어진 숫자 카드가 존재하는지 탐색합니다.

 

 


 

문제

 

풀이

1. Map 컨테이너 활용

// 1. Map 컨테이너를 활용했지만, 2번 코드보다 소요 시간과 메모리 사용량이 비교적 훨씬 높음...

#include <iostream>
#include <map>
#include <algorithm>
typedef long long ll;
using namespace std;

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

    int N, M;
    // 숫자 + 개수
    map<ll, int> m;
    vector<ll> v;

    cin >> N;

    for (int i = 0; i < N; i++)
    {
        ll num;
        cin >> num;

        m[num]++;
    }

    cin >> M;

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

        v.push_back(m[num2]);
    }

    for (int val : v)
        cout << val << " ";
}
1. Map 컨테이너 활용

먼저, 입력받은 숫자 카드와 각 숫자 카드의 개수를 한 쌍으로 Map 컨테이너에 삽입합니다.

2. v.push_back(m [num2])

입력받은 M개의 숫자 카드를 "Key"로 "Value" 값을 벡터에 순서대로 삽입합니다. 이때, Map 컨테이너에 존재하지 않는 새로운 숫자 카드, 혹은 "Key"값을 반환하면 0이 반환되는 것을 이용합니다.

* 수행 속도와 메모리 사용량이 너무 높아서 새로운 방법을 생각해보았습니다.

 

2. 정렬 알고리즘 및 lower_bound + upper_bound 활용

// 2. Sort 알고리즘과 lower_bound와 upper_bound 활용 코드, 시간 + 성능 모두 훨씬 뛰어남

#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;

using namespace std;

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

    int N, M;
    vector<ll> v;
    vector<int> v2;

    cin >> N;

    for (int i = 0; i < N; i++)
    {
        ll num;
        cin >> num;

        v.push_back(num);
    }

    sort(begin(v), end(v));

    cin >> M;

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

        auto upper = upper_bound(begin(v), end(v), num2);
        auto lower = lower_bound(begin(v), end(v), num2);

        v2.push_back(upper - lower);
    }

    for (auto val : v2)
        cout << val << " ";
}
1. lower_bound + upper_bound

같은 수의 lower_bound와 upper_bound를 구해서 빼주면 해당 숫자의 개수를 얻을 수 있습니다. 주의할 점은 lower_bound와 upper_bound 알고리즘을 사용하기 위해선 정렬이 선행되어야 합니다!