숫자 카드 2
https://www.acmicpc.net/problem/10816
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 92500 | 34417 | 24643 | 36.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; }
배열을 이상하게 선언해서 무엇이 잘못된 건지 한참을 고민했다.