백준 10816번 (숫자 카드 2, C++, 정렬) [BAEKJOON]

숫자 카드 2

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

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초256 MB92500344172464336.310%

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다.

상근이는 숫자 카드 N개를 가지고 있다.

정수 M개가 주어졌을 때,

이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다.

둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다.

숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다.

넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다.

이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서,

각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.

예제 입력 1

10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10

예제 출력 1

3 0 0 1 2 0 0 2

출처

알고리즘 분류


처음에 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다.

그 다음 줄(두번째)에는 N개의 숫자가 주어지는 데 범위는 -10,000,000 ~ 10,000,000 사이의 수다.

세번째에는 M이 주어지고 (1 ≤ M ≤ 500,000)

네번째 줄에는 M개의 숫자가 주어지는데 범위의 N개의 숫자와 같은 -10,000,000 ~ 10,000,000 사이의 수다.

문제에서 요구하는 것은 M개의 숫자들이 N개의 숫자들에 몇 개씩 존재하는지 출력하는 문제다.

숫자의 범위는 -10,000,000 ~ 10,000,000 이므로 arr[10,000,001][2] 이차원 배열을 선언하여 각 숫자에 따라 카운트를 올려주었다.

만약 10이 2번 나왔다면 arr[10][0]++, arr[10][0]++

-10이 나왔다면 arr[10][1]++ 두번째 인덱스를 부호로 사용하여 문제를 해결 하였다.

추가적으로 입력이 500,000 + 500,000 이 넘을 수 있으므로

아래의 코드를 추가하여 시간적인 이득을 얻었다.

    ios_base::sync_with_stdio(false); // scanf와 동기화를 비활성화
    // cin.tie(null); 코드는 cin과 cout의 묶음을 풀어줍니다.
    cin.tie(NULL);
    cout.tie(NULL);

통과된 코드

#include <iostream>
#include <list>

using namespace std;

int N, temp;

int arr[10000001][2];

list<int> myList;

int main()
{
    // N의 개수는 (1 ≤ N ≤ 500,000)
    ios_base::sync_with_stdio(false); // 동기화를 비활성화
    // cin.tie(null); 코드는 cin과 cout의 묶음을 풀어줍니다.
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N;
    while (N-- > 0) {
        cin >> temp;
        if (temp >= 0) { arr[temp][0]++; }
        else { arr[temp * -1][1]++; }
    }

    cin >> N;
    while (N-- > 0) {
        cin >> temp;
        myList.push_back(temp);
    }

    for (auto it = myList.begin(); it != myList.end(); it++) {
        if (*it >= 0) { cout << arr[*it][0] << " "; }
        else { cout << arr[*it * -1][1] << " "; }
    }

	return 0;
}

배열을 이상하게 선언해서 무엇이 잘못된 건지 한참을 고민했다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤