반응형

문제 링크 : https://www.acmicpc.net/problem/10816

 

10816번: 숫자 카드 2

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

www.acmicpc.net

 

> 풀이

1. 첫 번째 풀이 : 이진 탐색을 활용하여 upper_bound와 lower_bound 값을 구하자 ==> 시간 초과

 

2. 두 번째 풀이 : <algorithm>에서 제공하는 upper_bound와 lower_bound를 써보자 ==> 시간 초과

 

==> 시간 복잡도가 O(N * log N) 일 텐데..? 안 되는 이유 알려주시면 감사하겠습니다..

 

3. 세 번째 풀이 : 인터넷을 통해 열심히 찾아보니까 해시 맵 (unordered_map)을 사용하면 O(1)에 가까운 시간 복잡도로 탐색할 수 있더라고요.. 한 번도 써본 적이 없어서 https://en.cppreference.com/w/cpp/container/unordered_map참고하여 코드 작성했습니다. 공부가 많이 부족하네요..

 

<1, 2번 풀이 (시간 초과)>

#include <cstdio>
#include <algorithm>

using namespace std;

int arrN[100001];
int arrM[100001];

int main() {
    int M, N;
    int count = 0;

    scanf("%d", &N);
    for (int i = 0; i < N; i++)
        scanf("%d", &arrN[i]);

    scanf("%d", &M);
    for (int i = 0; i < M; i++)
        scanf("%d", &arrM[i]);

    sort(arrN, arrN + N);

    for (int i = 0; i < M; i++)
        printf("%d ", upper_bound(arrN, arrN + N, arrM[i]) - lower_bound(arrN, arrN + N, arrM[i]));

    return 0;
}

 

<3번 풀이>

#include <cstdio>
#include <algorithm>
#include <unordered_map>

using namespace std;

int main() {
    int N, M;
    int num;
    unordered_map <int, int> umap;
    
    scanf("%d", &N);

    for (int i = 0; i < N; i++) {
        scanf("%d", &num);
        umap[num]++;
    }
    
    scanf("%d", &M);
    for (int i = 0; i < M; i++) {
        scanf("%d", &num);
        printf("%d ", umap[num]);
    }
    
    return 0;
}

(개발환경 : vs code로 바꿨어요 ㅎㅎ)

반응형

'알고리즘 (백준) > BOJ 길라잡이 (1)' 카테고리의 다른 글

백준 5430 (AC) / C++  (0) 2020.07.10
백준 1966 (프린터 큐) / C++  (0) 2020.07.08
백준 1874 (스택 수열) / C++  (0) 2020.07.08
백준 1406 (에디터) / C++  (0) 2020.07.06
백준 1920 (수 찾기) / C++  (0) 2020.07.06

+ Recent posts