개발자의 기본기/알고리즘 문제

<백준 알고리즘> 10815번 숫자 카드

Ilhoon 2020. 9. 26. 21:14
시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초256 MB103494540320944.594%

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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을, 아니면 0을 공백으로 구분해 출력한다.

예제 입력 1 

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

예제 출력 1 

1 0 0 1 1 0 0 1



<풀이과정>


고유한 숫자 M이 주어지기 때문에 먼저 상근이의 숫자 카드 집합을 만들고 

거기서 개수를 세어 1개가 있으면 1을 출력하고 없으면 0을 출력하면 된다. 

숫자에 따른 개수를 저장할 필요도 없기때문에 바로 출력해주면 된다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
#include<set>
using namespace std;
 
int main(){
    int N; // 상근이가 가진 숫자카드의 개수
    cin >> N;
    set<int> s; // 상근이가 가진 카드 집합 
 
    while(N--){
        int x;
        cin >> x;// 카드에 적힌 숫자 
        s.insert(x);// 카드를 집합에 추가 
    } 
    
    int M; // 판별할 숫자의 개수
    cin >> M;
 
    for(auto i=0;i<M;i++){
        int x;
        cin >> x;// 판별할 숫자
 
        cout << s.count(x) << " ";
    } 
 
    return 0;     
}
cs