문제 출처 : https://www.acmicpc.net/problem/1920
1920번: 수 찾기
첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수들의 범위는 int 로 한다.
www.acmicpc.net
해쉬로 풀이 :
#include<iostream>
#define MAX_HASH 4294967 // int 범위를 1000으로 나눈 값
using namespace std;
typedef struct Node
{
int id;
Node* hashNext;
}Node;
Node* hashTable[MAX_HASH];
//해쉬함수
int HASH_KEY(int data){
int key;
if(data <0){
key = data / 1000;
key *= -1;
}else{
key = data / 1000;
key *= 2;
}
return key;
}
void AddHashData(int key, Node* node)
{
int hash_key = HASH_KEY(key);
if (hashTable[hash_key] == NULL)
{
hashTable[hash_key] = node;
}
else
{
node->hashNext = hashTable[hash_key];
hashTable[hash_key] = node;
}
}
int FindHashData(int id)
{
int hash_key = HASH_KEY(id);
if (hashTable[hash_key] == NULL)
return 0; //못찾으면 0
if (hashTable[hash_key]->id == id)
{
// return hashTable[hash_key];
return 1; //찾으면 1
}
else
{
Node* node = hashTable[hash_key];
while (node->hashNext)
{
if (node->hashNext->id == id)
{
// return node->hashNext;
return 1;
}
node = node->hashNext; //찾을 떄까지 검색
}
}
return 0;
}
int main()
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
int nInput;
cin >> nInput;
Node* node = new Node();
node->id = nInput;
node->hashNext = NULL;
AddHashData(node->id, node);
}
// PrintAllHashData();
int M;
cin >> M;
for (int i = 0; i < M; i++)
{
int mInput;
scanf("%d",&mInput); //시간 초과 때문에 scanf / printf 사용
printf("%d \n",FindHashData(mInput));
}
return 0;
}
'삼성전자 알고리즘 > 백준온라인' 카테고리의 다른 글
6. 3653 영화 수집 (0) | 2019.06.28 |
---|---|
5. 10755 컴퓨터실 (0) | 2019.06.28 |
4. 11066 파일 합치기 [힙] (0) | 2019.06.16 |
3. 2805 나무 자르기 (0) | 2019.06.16 |
2. 2961 도영이가 만든 맛있는 음식 (0) | 2019.05.09 |