본문 바로가기

삼성전자 알고리즘/백준온라인

1. 1920 수 찾기

문제 출처 : 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