[SWEA] 코드배틀(레벨업코스) : 2.키조사
풀이
삼성역량테스트B형 유형 문제 STL사용금지, API만 구현하는 유형.
해싱 간단하게 구현했다.
소수이런걸 찾아서 하면 더 빠른것 같지만,
무난하게 크게잡고 체이닝 하는 방식으로 구현했다.
코드
키조사
typedef unsigned long long ulong;
#define M 1000001
int arr[M];
struct Node
{
ulong data;
Node* next;
};
Node nodePool[1500000];
int nodeCnt;
struct List
{
Node* head;
Node* tail;
Node* ptr;
void init() {
head = &nodePool[nodeCnt++];
tail = head;
head->next = tail;
tail->next = tail;
ptr = head;
}
void add(ulong d) {
Node* temp = &nodePool[nodeCnt++];
temp->data = d;
temp->next = ptr->next;
ptr->next = temp;
ptr = temp;
}
};
List list[M];
void init()
{
nodeCnt = 0;
for (register int i = 0; i < M; i++) {
arr[i] = 0;
}
for (register int i = 0; i < M; i++) {
list[i].init();
}
}
//나누기십만
//일단 배열 만들고
//arr에 충돌숫자 기록해둠
//만약 충돌숫자가 1이상이면
//해당
int checkKey(ulong key)
{
int num = key % M;
if (arr[num] > 0) {
//리스트 순회해서 찾아봄
Node * np = list[num].head;
int flag = 0;
for (int i = 0; i < arr[num]; i++) {
np = np->next;
if (key == np->data) {
flag = 1;
break;
}
}
//겹치는게 존재
if (flag) {
return 0;
}
//겹치는게 없음
else {
arr[num]++;
list[num].add(key);
return 1;
}
}
else {
arr[num] = 1;
list[num].add(key);
return 1;
}
}
Written on August 10, 2019