๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Tech Stack/Java & Spring

[์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ] ํ•ด์‹œ(Hash)

by _silver 2025. 4. 6.

 

์ž๋ฐ” ์ž๋ฃŒ๊ตฌ์กฐ- ํ•ด์‹œ(Hash) : ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์กฐํšŒ์™€ ์ค‘๋ณต ๋ฐฉ์ง€ ๊ฐ€๋Šฅ!

 

1. ๋ฆฌ์ŠคํŠธ vs ์…‹(Set)
๊ตฌ์กฐ ์ˆœ์„œ ์ค‘๋ณต ํŠน์ง•
List O O ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜, ์ˆœ์„œ ์œ ์ง€
Set X X ์ค‘๋ณต ์ œ๊ฑฐ, ๋น ๋ฅธ ํƒ์ƒ‰

 

๋”๋ณด๊ธฐ
List<String> cart = List.of("apple", "apple", "banana");
Set<String> ids = Set.of("user1", "user2"); // "user1" ์ค‘๋ณต ์ถ”๊ฐ€ ๋ถˆ๊ฐ€

2. Set ๊ตฌํ˜„ ์ฝ”๋“œ ์˜ˆ์‹œ

โ˜‘๏ธŽ O(n)์˜ ์„ ํ˜• ํƒ์ƒ‰ -> ์ค‘๋ณต์€ ์ž˜ ๋ง‰์ง€๋งŒ ๋А๋ฆฌ๋‹ค.

๋”๋ณด๊ธฐ
// ๋‚ด๋ถ€ ๋ฐฐ์—ด: ๊ณ ์ • ํฌ๊ธฐ 10
private int[] elementData = new int[10];
private int size = 0;

// ์ค‘๋ณต ์—†์ด ๊ฐ’ ์ถ”๊ฐ€
public boolean add(int value) {
    if (contains(value)) return false; // ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์ถ”๊ฐ€ X
    elementData[size++] = value;       // ๋ฐฐ์—ด์— ์ €์žฅ ํ›„ size ์ฆ๊ฐ€
    return true;
}

// ํŠน์ • ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธ
public boolean contains(int value) {
    for (int data : elementData) {
        if (data == value) return true; // ์ฐพ์œผ๋ฉด true ๋ฐ˜ํ™˜
    }
    return false;
}

3. ํ•ด์‹œ(Hash)์˜ ๋“ฑ์žฅ

โ˜‘๏ธŽ ์„ ํ˜• ํƒ์ƒ‰ : O(n)์˜ 

int[] data = {1, 2, 5, 8};
int target = 8;
for (int i : data) {
    if (i == target) return true;
}

 

โ˜‘๏ธŽ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ ‘๊ทผ : O(1)

Integer[] hashArray = new Integer[10];
hashArray[8] = 8; // ๊ฐ’์ด ๊ณง ์ธ๋ฑ์Šค ์—ญํ• ์„ ํ•จ
System.out.println(hashArray[8]); // ๊ฒฐ๊ณผ: 8

 


4. But,,,, ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ์‹ฌํ•จ...

โ˜‘๏ธŽ ์˜ˆ) ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ๋Š˜๋ ค๋ณด๋ฉด?

 - ๊ฐ’์€ ๋ช‡๊ฐœ ์—†๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋„ˆ๋ฌด ์ปค์„œ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๊ฒŒ ๋จ

// ์‹ค์ œ๋กœ๋Š” ๋ช‡ ๊ฐœ๋งŒ ์“ฐ๋Š”๋ฐ ๋ฐฐ์—ด์€ 100์นธ
Integer[] inputArray = new Integer[100];
inputArray[99] = 99;

 


5. ํ•ด์‹œ ์ธ๋ฑ์Šค(Hash Index) ๋ฐœ๊ฒฌ

โœ… ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•˜์ž!

// ๋ฒ”์œ„๊ฐ€ ๋„š์€ ๊ฐ’์„ ์ œํ•œ๋œ ๋ฐฐ์—ด ๊ณต๊ฐ„์— ํšจ์œจ์ ์œผ๋กœ ๋งคํ•‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค
int hashIndex = value % 10;  // ํ•ญ์ƒ 0~9 ์‚ฌ์ด ๊ฐ’๋งŒ ๋‚˜์˜ด

 

โ˜‘๏ธ ์ €์žฅ

int index = value % 10;
inputArray[index] = value; // ํ•ด์‹œ ์ธ๋ฑ์Šค๋ฅผ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ

 

โ˜‘๏ธ ์กฐํšŒ

int result = inputArray[searchValue % 10]; // ํ•ด์‹œ ์ธ๋ฑ์Šค๋กœ ๋ฐ”๋กœ ์ ‘๊ทผ

6. ํ•ด์‹œ ์ถฉ๋Œ์˜ ๋ฌธ์ œ
// 99 % 10 = 9  
// 9 % 10 = 9  
// → ๋‘˜ ๋‹ค index 9์— ์ €์žฅ๋จ

 

๋”๋ณด๊ธฐ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ๋ฐฐ์—ด ์•ˆ์— ๋ฆฌ์ŠคํŠธ(๋ฒ„ํ‚ท) ๋„ฃ๊ธฐ

// ํฌ๊ธฐ 10์งœ๋ฆฌ LinkedList ๋ฐฐ์—ด
LinkedList<Integer>[] buckets = new LinkedList[10];

for (int i = 0; i < 10; i++) {
    buckets[i] = new LinkedList<>(); // ๊ฐ ์ธ๋ฑ์Šค์— ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
}
void add(LinkedList<Integer>[] buckets, int value) {
    int index = value % 10;
    if (!buckets[index].contains(value)) {
        buckets[index].add(value);
    }
}

7. ์ถฉ๋Œ๊นŒ์ง€ ๊ณ ๋ คํ•œ HashSet ๊ตฌํ˜„ ์˜ˆ์ œ
๋”๋ณด๊ธฐ
static final int CAPACITY = 10;

public static void main(String[] args) {
    // ํ•ด์‹œ ๋ฒ„ํ‚ท ์ดˆ๊ธฐํ™”
    LinkedList<Integer>[] buckets = new LinkedList[CAPACITY];
    for (int i = 0; i < CAPACITY; i++) {
        buckets[i] = new LinkedList<>();
    }

    // ๊ฐ’ ์ถ”๊ฐ€ (์ถฉ๋Œ ๊ณ ๋ ค)
    add(buckets, 1);
    add(buckets, 99); // 99 % 10 = 9 → ์ถฉ๋Œ ๋ฐœ์ƒ

    // ๊ฐ’ ๊ฒ€์ƒ‰
    int searchValue = 99;
    boolean contains = contains(buckets, searchValue);
    System.out.println(searchValue + " ์กด์žฌ ์—ฌ๋ถ€: " + contains);
}

 

โ˜‘๏ธ ๊ฐ’ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ

private static void add(LinkedList<Integer>[] buckets, int value) {
    int index = value % CAPACITY;          // ํ•ด์‹œ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ
    LinkedList<Integer> bucket = buckets[index]; // ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ

    if (!bucket.contains(value)) {         // ์ค‘๋ณต ๋ฐฉ์ง€
        bucket.add(value);                 // ๋ฆฌ์ŠคํŠธ์— ๊ฐ’ ์ถ”๊ฐ€
    }
}

 

โ˜‘๏ธ ๊ฐ’ ๊ฒ€์ƒ‰ ๋ฉ”์„œ๋“œ

private static boolean contains(LinkedList<Integer>[] buckets, int value) {
    int index = value % CAPACITY;              // ํ•ด์‹œ ์ธ๋ฑ์Šค ๊ณ„์‚ฐ
    LinkedList<Integer> bucket = buckets[index]; // ๋ฆฌ์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
    return bucket.contains(value);             // ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€ ํƒ์ƒ‰
}

8.Hash ์„ฑ๋Šฅ๊ณผ ์ถฉ๋Œ ํ™•๋ฅ 
๋ฐฐ์—ด ํฌ๊ธฐ(CAPACITY) ์ถฉ๋Œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ
์ž‘์„ ์ˆ˜๋ก ๋†’์Œ
ํด์ˆ˜๋ก ๋‚ฎ์Œ

 โ˜‘๏ธŽ ์ถฉ๋Œ ์ค„์ด๊ธฐ : ์ ์ ˆํ•œ ๋ฐฐ์—ด ํฌ๊ธฐ

 โ˜‘๏ธŽ ์ผ๋ฐ˜์ ์œผ๋กœ : ์‚ฌ์šฉ๋Ÿ‰์˜ 75% ์ดํ•˜๊ฐ€ ๋˜๋„๋ก ์„ค์ •

 โ˜‘๏ธŽ ์ถœ๋™ ์‹œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ๋กœ ์ธํ•ด ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ์Œ


9. ์ •๋ฆฌ
ํ•ญ๋ชฉ ํ•ด์‹œ ์ธ๋ฑ์Šค ๋ฐฉ์‹
์ €์žฅ ์†๋„ ํ‰๊ท  O(1), ์ตœ์•… O(n)
์กฐํšŒ ์†๋„ ํ˜•๊ท  O(1), ์ตœ์•… O(n)
์ค‘๋ณต ํ—ˆ์šฉ ์—ฌ๋ถ€ X (Set ๊ตฌ์กฐ ๊ธฐ์ค€)
๊ณต๊ฐ„ ํ™œ์šฉ ํšจ์œจ์„ฑ ๋‚˜๋จธ์ง€ ์—ฐ์ƒ + ๋ฒ„ํ‚ท์œผ๋กœ ์ตœ์ ํ™” ๊ฐ€๋Šฅ
์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฒ„ํ‚ท(๋ฆฌ์ŠคํŠธ)์— ์ €์žฅ, contains()๋กœ ํ™•์ธ

 

 

<์ฐธ๊ณ > - ๊น€์˜ํ•œ์˜ ์‹ค์ „ ์ž๋ฐ” ์ค‘๊ธ‰2ํŽธ ๊ฐ•์˜ ์„น์…˜ 7. ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ํ•ด์‹œ(Hash)