Post

Direct Access Table (DAT)

Direct Access Table (DAT)

DAT(Direct Access Table)란?

DAT는 값을 인덱스로 활용하는 자료구조
Java의 객체나 파이썬의 딕셔너리처럼, DAT를 사용하면 키의 존재 유무 확인, 개수 카운트 등이 가능
C++에서는 아래와 같은 방식으로 사용

1
2
int bucket[200]; 
bucket['A'] = 1;

DAT의 활용 예시

배열에 어떤 종류의 알파벳이 있는지 찾아내는 문제

1
2
3
예시 배열: A D B F A D

출력 결과: ABDF

일반적인 방법은 중첩 for문을 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

char arr[10] = "ADBFAD";

int main() {
    for (int i = 0; arr[i] != '\0'; i++) {
        bool isUnique = true;
        for (int j = 0; j < i; j++) {
            if (arr[i] == arr[j]) {
                isUnique = false;
                break;
            }
        }
        if (isUnique) {
            cout << arr[i];
        }
    }
    return 0;
}

하지만 DAT를 사용하면 중첩 for문 없이도 문제를 해결할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

int main() {
    int bucket[200] = { 0 };
    char vect[7] = "ABDFAD";

    for (int i = 0; i < 6; i++) {
        bucket[vect[i]] = 1;
    }

    for (int i = 0; i < 200; i++) {
        if (bucket[i] == 1) cout << (char)(i);
    }
    return 0;
}

DAT의 특징으로는 자동으로 오름차순 정렬이 됨

DAT의 응용

DAT는 문자 인덱스뿐만 아니라 숫자 인덱스 카운트 등이 가능

1
2
3
4
5
6
7
예시 배열: 4 1 1 1 5 4

출력 결과:

1: 3개
4: 2개
5: 1개

DAT 활용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;

int main() {
    int bucket[200] = { 0 };
    int vect[6] = { 4, 1, 1, 1, 5, 4 };

    for (int i = 0; i < 6; i++) {
        bucket[vect[i]]++;
    }

    for (int i = 0; i < 200; i++) {
        if (bucket[i] > 0) {
            cout << i << " : " << bucket[i] << "개\n";
        }
    }
    return 0;
}

DAT는 플래그 용도뿐만 아니라 카운트를 저장하는데도 사용가능

This post is licensed under CC BY 4.0 by the author.