week 5 hyowon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

ํ•ด์‰ฌ๋งต ์ถฉ๋Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

ํ•ด์‹œ์ถฉ๋Œ์ด๋ž€ ํ•ด์‹œํ•จ์ˆ˜๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ถœ๋ ฅ๊ฐ’์„ ๋‚ด๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ , ์•”ํ˜ธํ•™์  ํ•ด์‹œํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ํ•ด์‹œํ•จ์ˆ˜์˜ ์•ˆ์ •์„ฑ์„ ๊นจ๋œจ๋ฆฌ๋Š” ์ถฉ๋Œ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜๋„์ ์ธ ํ•ด์‹œ์ถฉ๋Œ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์–ด๋ ต๋„๋ก ์„ค๊ณ„๋˜์–ด์•ผ ํ•œ๋‹ค.

๋น„๋‘˜๊ธฐ์ง‘ ์›๋ฆฌ์— ์˜ํ•ด ํ•ด์‰ฌ๋งต์€ ํ•ญ์ƒ ์ถฉ๋Œ์ด ์˜ˆ๊ฒฌ๋˜์–ด ์žˆ๋‹ค.

* ๋น„๋‘˜๊ธฐ์ง‘ ์›๋ฆฌ

n+1๊ฐœ์˜ ๋ฌผ๊ฑด์„ n๊ฐœ์˜ ์ƒ์ž์— ๋„ฃ์„ ๋•Œ ์ ์–ด๋„ ์–ด๋Š ํ•œ ์ƒ์ž์—๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฌผ๊ฑด์ด ๋“ค์–ด์žˆ๋‹ค๋Š” ์›๋ฆฌ

ํ•ด์‹œ๋งต์—์„œ ํ‚ค๊ฐ’์€ n์ž๋ฆฌ์ˆ˜์ธ๋ฐ, ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค์˜ ๊ฐฏ์ˆ˜๋Š” ๋ฌดํ•œํ•˜๋‹ˆ, ๋น„๋‘˜๊ธฐ์ง‘ ์›๋ฆฌ๋ฅผ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด์‹œ ์ถฉ๋Œ ํ•ด๊ฒฐ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

์ถฉ๋Œ์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ๋ฐฉ๋ฒ•

1. Open Addressing (์ด๋ฆ„ ๋ฌด์‹œ)

์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด ๋‹ค๋ฅธ ์ธ๋ฑ์Šค์— ์ €์žฅํ•˜๋„๋ก ์กฐ์ •ํ•œ๋‹ค. ํ•ด์‹œ ๊ฐ’๊ณผ ์‹ค์ œ ์ €์žฅ๋œ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

์„ ํ˜• ํƒ์‚ฌ

์ด๋ฏธ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ์นธ์˜ ๋‹ค์Œ ์นธ์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.(+1, +2, ...)

๋ฐ์ดํ„ฐ๋“ค์ด ํŠน์ • ์œ„์น˜์—๋งŒ ๋ฐ€์ง‘ํ•˜๋Š” ํ˜„์ƒ(primary clustering)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ํƒ์ƒ‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์ด ์†Œ์š”๋œ๋‹ค.

์ œ๊ณฑ ํƒ์‚ฌ

์ด๋ฏธ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ์นธ์— n^2(n์€ ์ถฉ๋ŒํšŸ์ˆ˜)์„ ๋”ํ•œ ์นธ์— ์ €์žฅํ•œ๋‹ค(+1^2, +2^2, +3^2, ...).

ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์‹œ์ž‘ ํ•ด์‹œ๊ฐ’์ด ๊ฐ™์„ ๊ฒฝ์šฐ, ๊ทธ ์ดํ›„์˜ ํ•ด์‹œ๊ฐ’๋“ค๋„ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ๋˜์–ด ์ถฉ๋Œ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๋‹จ์ (secondary clustering)์ด ์žˆ๋‹ค.

์ด์ค‘ํ•ด์‹œ

ํ•ด์‰ฌ ํ•จ์ˆ˜๋ฅผ ๋‘ ๊ฐ€์ง€๋ฅผ ๋‘๊ณ  ํ‰์†Œ์—๋Š” ํ•ด์‰ฌํ•จ์ˆ˜1๋งŒ ์“ฐ๋‹ค๊ฐ€ ์ถฉ๋Œ์‹œ ํ•ด์‰ฌํ•จ์ˆ˜2๋ฅผ ์จ์„œ ์ƒˆ๋กœ์šด ์ธ๋ฑ์Šค๋กœ ์กฐ์ •ํ•œ๋‹ค.

2. Close Addressing

์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋„ ํ•ด๋‹น ์œ„์น˜์— ์ €์žฅํ•œ๋‹ค. ๋‹ค๋งŒ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์จ์„œ ๊ธฐ์กด ๊ฐ’์„ ๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ๋ฎ์–ด์”Œ์šฐ์ง€ ์•Š๊ฒŒ ์ €์žฅํ•œ๋‹ค. ํ•ด์‹œ ๊ฐ’๊ณผ ์‹ค์ œ ์ €์žฅ๋œ ์œ„์น˜๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์—†๋‹ค.

๋ฒ„์ผ“

๋ฐฐ์—ด์˜ ์š”์†Œ ์•ˆ์— ๋‹ค์‹œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ €์žฅํ•œ๋‹ค.

https://t1.daumcdn.net/cfile/tistory/234EE34C53C9CCDC26

Seperate Chaining - Java HashMap ์ฑ„ํƒ

์ถฉ๋Œ๋œ ๊ฐ’๋“ค์„ LinkedList๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.

Open Addressing์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์ฒ˜๋ฆฌ๊ฐ€ ํšจ์œจ์ ์ด๊ธฐ ์–ด๋ ค์šด๋ฐ, HashMap์—์„œ remove() ๋ฉ”์„œ๋“œ๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Seperate Chaining์„ ํ™œ์šฉํ•œ๋‹ค. ๋˜ํ•œ HashMap์— ์ €์žฅ๋œ key-value ๊ฐœ์ˆ˜๊ฐ€ ์ผ์ • ์ด์ƒ์œผ๋กœ ๋งŽ์•„์ง€๋ฉด, ์ผ๋ฐ˜์ ์œผ๋กœ Open Addressing์€ Separate Chaining๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค. Open Addressing์˜ ๊ฒฝ์šฐ ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ฑ„์šด ๋ฐ€๋„๊ฐ€ ๋†’์•„์งˆ์ˆ˜๋ก Worst Case ๋ฐœ์ƒ ๋นˆ๋„๊ฐ€ ๋” ๋†’์•„์ง„๋‹ค.

https://t1.daumcdn.net/cfile/tistory/23307B4153C9CDC70A

Java 7

ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚  ๋•Œ LinkedList๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

Java 8

ํ•œ ๋ฒ„ํ‚ท(, ์ฆ‰ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’)์— key-value์Œ์ด 8๊ฐœ ์ด์ƒ์ด๋ฉด Tree๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , 6์ดํ•˜๋ฉด LinkedList๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

8๊ณผ 6์œผ๋กœ 2 ์ด์ƒ์˜ ์ฐจ์ด๋ฅผ ๋‘” ๊ฒƒ์€, ๋งŒ์•ฝ ์ฐจ์ด๊ฐ€ 1์ด๋ผ๋ฉด ์–ด๋–ค ํ•œ key-value ์Œ์ด ๋ฐ˜๋ณต๋˜์–ด ์‚ฝ์ž…/์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํŠธ๋ฆฌ์™€ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์ด ๋ฐ˜๋ณต๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ ๊ฒฐ๊ณผ get()๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ธฐ๋Œ“๊ฐ’์ด Java 7 ์—์„œ๋Š” E(N/M) ์ด์—ˆ๋‹ค๋ฉด, Java 8์—์„œ๋Š” E(log(N/M))์ด ๋˜์—ˆ๋‹ค.

์ด ๋•Œ๋ฌธ์— Java 7์˜ Entry ํด๋ž˜์Šค ๋Œ€์‹  Java 8์—์„œ๋Š” TreeNode๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Node ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•ด์‹œ ๋ฒ„ํ‚ท ๋™์  ํ™•์žฅ

ํ•ด์‹œ ๋ฒ„ํ‚ท(๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„)์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์•„๋‚„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด์‹œ ์ถฉ๋Œ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ƒ ์†์‹ค์ด ๋ฐœ์ƒํ•œ๋‹ค. key-value ์Œ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์ • ์ด์ƒ์ด ๋˜๋ฉด, ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ฆฐ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 16์ด๊ณ , ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” 2^30 ์ด๋‹ค.

ํ™•์žฅ ์‹œ์  - ์ž„๊ณ„์ ์„ ๋„˜์œผ๋ฉด

์ž„๊ณ„์  = load factor * ํ˜„์žฌ ํ•ด์‹œ ๋ฒ„ํ‚ท ๊ฐœ์ˆ˜

load factor์˜ ๊ธฐ๋ณธ๊ฐ’์€ 0.75์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜๊ฐ€ 16๊ฐœ์ผ ๋•Œ์—๋Š” ์ž„๊ณ„์ ์ด 12๊ฐœ๊ฐ€ ๋œ๋‹ค.

๋‹ค๋งŒ, ๋ฒ„ํ‚ท ๊ฐœ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  key-value ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์ƒˆ๋กœ์šด Separate Chaining์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, HashMap ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ ์ดˆ๊ธฐ ํ•ด์‹œ ๋ฒ„ํ‚ท ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋Š” newCapacity๋Š” ์–ธ์ œ๋‚˜ 2a์ด๋‹ค.
void resize(int newCapacity) {  
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;

        // MAXIMIM_CAPACITY๋Š” 230์ด๋‹ค.
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }

        Entry[] newTable = new Entry[newCapacity];

        // ์ƒˆ ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๊ธฐ์กด์˜ ๋ชจ๋“  ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ๋“ค์„
        // ์ƒˆ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ์ €์žฅํ•œ๋‹ค.
        transfer(newTable, initHashSeedAsNeeded(newCapacity));
        table = newTable;
        threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
    }

    void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;
        // ๋ชจ๋“  ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ์ˆœํšŒํ•˜๋ฉด์„œ
        for (Entry<K,V> e : table) {
            // ๊ฐ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ์žˆ๋Š” ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ
            while(null != e) {
                Entry<K,V> next = e.next;
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                // ํ•ด์‹œ ๋ฒ„ํ‚ท ๊ฐœ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
                // index ๊ฐ’(hashCode % M)์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค. 
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            }
        }
    }

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ํ•ด์‹œ ๋ฒ„ํ‚ท ํฌ๊ธฐ๋ฅผ ๋‘ ๋ฐฐ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์—๋Š” ๊ฒฐ์ •์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ํ•ด์‹œ ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜ M์ด 2a ํ˜•ํƒœ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, index = X.hashCode() % M์„ ๊ณ„์‚ฐํ•  ๋•Œ X.hashCode()์˜ ํ•˜์œ„ a๊ฐœ์˜ ๋น„ํŠธ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ 32๋น„ํŠธ ์˜์—ญ์„ ๊ณ ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค ํ•˜๋”๋ผ๋„ ํ•ด์‹œ ๊ฐ’์„ 2์˜ ์Šน์ˆ˜๋กœ ๋‚˜๋ˆ„๋ฉด ํ•ด์‹œ ์ถฉ๋Œ์ด ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋•Œ๋ฌธ์— ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜

index = X.hashCode() % M์„ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” M ๊ฐ’์€ ์†Œ์ˆ˜์ผ ๋•Œ index ๊ฐ’ ๋ถ„ํฌ๊ฐ€ ๊ฐ€์žฅ ๊ท ๋“ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ M ๊ฐ’์ด ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ index ๊ฐ’ ๋ถ„ํฌ๊ฐ€ ๊ฐ€๊ธ‰์  ๊ท ๋“ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜(supplement hash function)์˜ ๋ชฉ์ ์€ 'ํ‚ค'์˜ ํ•ด์‹œ ๊ฐ’์„ ๋ณ€ํ˜•ํ•˜์—ฌ, ํ•ด์‹œ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ ์ด๋‹ค. ์ด ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” JDK 1.4์— ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค. Java 5 ~ Java 7์€ ๊ฐ™์€ ๋ฐฉ์‹์˜ ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , Java 8๋ถ€ํ„ฐ๋Š” ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๋ฐฉ์‹์˜ ๋ณด์กฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

String ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ•ด์‹œ ํ•จ์ˆ˜

java 8

public int hashCode() {  
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

์œ„ ์ฝ”๋“œ๋Š” Horner's method๋ฅผ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์œผ๋กœ, ๋‹จํ•ญ์‹์„ ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋‹คํ•ญ์‹ ์—ฐ์‚ฐ์„ ํ‘œํ˜„ํ•˜์˜€๋‹ค.

String ๊ฐ์ฒด ํ•ด์‹œ ํ•จ์ˆ˜์—์„œ 31์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • 31์ด ์†Œ์ˆ˜ ์ด๋ฉฐ ๋˜ํ•œ ์–ด๋–ค ์ˆ˜์— 31์„ ๊ณฑํ•˜๋Š” ๊ฒƒ์€ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • 31N=32N-N์ธ๋ฐ, 32๋Š” 25์ด๋‹ˆ ์–ด๋–ค ์ˆ˜์— ๋Œ€ํ•œ 32๋ฅผ ๊ณฑํ•œ ๊ฐ’์€ shift ์—ฐ์‚ฐ์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ N์— 31์„ ๊ณฑํ•œ ๊ฐ’์€, (N << 5) โ€“ N๊ณผ ๊ฐ™๋‹ค. 31์„ ๊ณฑํ•˜๋Š” ์—ฐ์‚ฐ์€ ์ด๋ ‡๊ฒŒ ์ตœ์ ํ™”๋œ ๋จธ์‹  ์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, String ํด๋ž˜์Šค์—์„œ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋•Œ์—๋Š” 31์„ ์Šน์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ฐธ๊ณ 

https://stdin2stdout.tistory.com/entry/Q-ํ•ด์‰ฌ-์ถฉ๋Œ์ด-๋ฌด์—‡์ด๊ณ -ํ•ด๊ฒฐ์ฑ…์„-์•Œ๊ณ -์žˆ๋‚˜์š”

https://d2.naver.com/helloworld/831311

โš ๏ธ **GitHub.com Fallback** โš ๏ธ