๊ด€๋ฆฌ ๋ฉ”๋‰ด

be_better

[์ž๋ฃŒ๊ตฌ์กฐ] ๋ฐฐ์—ด (Array) ๋ณธ๋ฌธ

์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] ๋ฐฐ์—ด (Array)

NiceTry 2023. 8. 10. 15:44

๋ชฉ์ฐจ

    ๐Ÿ“š ๋ฐฐ์—ด (Array)

    ๋ฐฐ์—ด์€ index์™€ data๊ฐ€ 1:1๋กœ ๋งคํ•‘๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋งŽ์€ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. (๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ)

    index๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— data๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

     

    ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค์˜ type์€ ๋‹ค ๊ฐ™์•„์•ผ ํ•˜๊ณ  ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์›์†Œ๋“ค ๋ชจ๋‘ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋Š”๋‹ค.

     

    index์˜ ์ˆ˜์— ๋”ฐ๋ผ ์ฐจ์›์ด ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (1์ฐจ์›๋ฐฐ์—ด, 2์ฐจ์›๋ฐฐ์—ด, ...)

     

    ๐Ÿ‘ ์žฅ์ 

    index๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—

    ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๐Ÿ‘Ž ๋‹จ์ 

    ๋ฐฐ์—ด์˜ ์ƒ์„ฑํ•  ๋•Œ ๋ฏธ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ์—ด์„ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

    ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€/์‚ญ์ œ ์‹œ์— ์›์†Œ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.


    โœ๐Ÿป ๋ฐฐ์—ด ADT (์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…)

    create(size) size๋ฅผ ๋ฐ›์•„ ๋ฐฐ์—ด ์ƒ์„ฑ
    insert(index, item) index์™€ ์ถ”๊ฐ€ํ•  item์„ ๋ฐ›์•„ ํ•ด๋‹น index์— ์‚ฝ์ž…
    remove(item) item์„ ๋ฐ›์•„ ์žˆ์œผ๋ฉด ์‚ญ์ œ
    isOver(index) index๊ฐ€ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ true, false
    print() ๋ฐฐ์—ด ์ „์ฒด ์›์†Œ ์ถœ๋ ฅ

     


    โš™๏ธ ๋ฐฐ์—ด ๊ธฐ๋Šฅ & ๋™์ž‘์›๋ฆฌ

    ์ƒ์„ฑ

    1. size๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์Œ
    2. ์ž…๋ ฅ๋ฐ›์€ size๋ฅผ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋กœ ์„ค์ •
    // ์Šˆ๋„ ์ฝ”๋“œ
    
    Array arr;
    
    public void create(int size) {
    	arr = new Array[size];
    }

     

    ์‚ฝ์ž…

    1. index์™€ item์„ ์ž…๋ ฅ๋ฐ›์Œ
    2. isOver(index)๋กœ ์ž…๋ ฅ๋ฐ›์€ index๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธ
    3. isOver(index)๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ ํ›„ ์ข…๋ฃŒ
    4. ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ธฐ์กด ๋ฐฐ์—ด์˜ ํ•ด๋‹น index์˜ ๊ฐ’์„ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด (size + 1)์„ ํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด ์ƒ์„ฑ
    5. ์ž…๋ ฅ๋ฐ›์€ index๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ณต๊ฐ„์— ๊ธฐ์กด ๋ฐฐ์—ด์˜ ๊ฐ’๋“ค ์ฑ„์›€
    6. ์ž…๋ ฅ๋ฐ›์€ index์— ์ž…๋ ฅ๋ฐ›์€ item ์‚ฝ์ž…
    // ์Šˆ๋„ ์ฝ”๋“œ
    
    public void insert(int index, T item) {
    	if (isOver(index)) { // ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ํ•ด๋‹น ์ธ๋ฑ์Šค๋ณด๋‹ค ํฌ๋ฉด
        	print(error); // ์—๋Ÿฌ ๋ฐœ์ƒ
        }
        
        T[] temp = arr.clone(); // temp ๋ฐฐ์—ด์— ์›๋ž˜ ๋ฐฐ์—ด ๋ณต์‚ฌํ•ด๋†“๊ธฐ
        arr = new T[arr.length + 1]; // item์„ ๋„ฃ์„ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— size + 1
        
        for (i = 0; i < index; i++) {
        	arr[i] = temp[i]; // 0๋ถ€ํ„ฐ index ์ „ ๊นŒ์ง€๋Š” ๋ฐ์ดํ„ฐ ๊ทธ๋Œ€๋กœ ์œ ์ง€
        }
        
        for (i = index + 1; i < arr.length; i++) {
        	arr[i] = temp[i-1]; // index ๋‹ค์Œ ๋ถ€ํ„ฐ ๋๊นŒ์ง€
        }
        
        arr[index] = item; // index์œ„์น˜์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— item์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
    }

     

    ์‚ญ์ œ

    1. item ์„ ์ž…๋ ฅ๋ฐ›์Œ
    2. ๋ฐฐ์—ด์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋Œ๋ฉฐ item์ด ์žˆ๋Š”์ง€ ํ™•์ธ
    3. ์—†๋‹ค๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ ํ›„ ์ข…๋ฃŒ
    4. ์žˆ์œผ๋ฉด ํ•ด๋‹น index๋ฅผ ๋ฐ›์•„์˜ด (targetIndex๋กœ ๋ณ€์ˆ˜ ์„ ์–ธ)
    5. ๋”ฐ๋กœ ์ง€์šฐ๋Š” ์ž‘์—… ํ•„์š”์—†์ด targetIndex ๋‹ค์Œ index๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ์„œ item์„ ์‚ญ์ œ
    // ์Šˆ๋„ ์ฝ”๋“œ
    
    public void remove(T item) {
    
    	int targetIndex = -1; // ์ตœ์†Œ index๋Š” 0์ด๊ธฐ ๋•Œ๋ฌธ์— -1์„ ๋„ฃ์–ด์คŒ
        
    	for (i = 0; i < item.length; i++) {
        	if (arr[i] == item) {
            	targetIndex = i; // ์ฐพ์œผ๋ฉด ํ•ด๋‹น index๋ฅผ targetIndex์— ๋„ฃ์–ด์คŒ
                break; // ์ฐพ์œผ๋ฉด ๋ฐ”๋กœ for๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ
            }
        }
        
        if (targetIndex == -1) {
        	print(error); // targetIndex๊ฐ€ -1์ด๋ž€ ๊ฒƒ์€ ํ•ด๋‹น item์ด ์—†์Œ์„ ์˜๋ฏธ
        } else {
        
        	T[] temp = arr.clone(); // temp ๋ฐฐ์—ด์— ์›๋ž˜ ๋ฐฐ์—ด ๋ณต์‚ฌํ•ด๋†“๊ธฐ
            arr = new T[arr.length - 1]; // item์„ ํ•˜๋‚˜ ์ง€์šฐ๋ฉด ๊ธธ์ด๊ฐ€ ํ•˜๋‚˜ ์ค„์–ด๋“ฆ
            
            for (i = 0; i < targetIndex; i++) {
                arr[i] = temp[i]; // 0๋ถ€ํ„ฐ targetIndex ์ „ ๊นŒ์ง€๋Š” ๋ฐ์ดํ„ฐ ๊ทธ๋Œ€๋กœ ์œ ์ง€
            }
            
            for (i = targetIndex; i < arr.length; i++) {
                arr[i] = temp[i+1];
                /*
                 * ๊ธฐ์กด targetIndex์˜ ๊ฐ’์€ ์ง€์›Œ์ €์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
                 * targetIndex๋ถ€ํ„ฐ ๋๊นŒ์ง€
                 * ๊ธฐ์กด ์œ„์น˜์˜ ๋‹ค์Œ ์œ„์น˜ item๋“ค๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ํ•ด์ค€๋‹ค.
                 */
            }
            
        }
    }

    โฑ๏ธ ๋ฐฐ์—ด์˜ ์‹œ๊ฐ„๋ณต์žก๋„

    • ์ ‘๊ทผ(access) O(1)
    • ๊ฒ€์ƒ‰(search) O(n)
    • ์ถ”๊ฐ€(add) O(1) or O(n)
    • ์ œ๊ฑฐ(remove) O(1) or O(n)

    ์ ‘๊ทผ (access)

    ๋ฐฐ์—ด์˜ ์ ‘๊ทผ์€ n๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— index๊ฐ’์„ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

     

    ๊ฒ€์ƒ‰ (search)

    ๋ฐฐ์—ด์˜ ๊ฒ€์ƒ‰์€ ์ˆœ์ฐจ๊ฒ€์ƒ‰์ด๋ฏ€๋กœ

    ์ตœ์•…์œผ๋กœ๋Š” ์ œ์ผ ์ฒซ index๋ถ€ํ„ฐ ๋ฐฐ์—ด์˜ ๋๊นŒ์ง€ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

     

    ์ถ”๊ฐ€ (add) , ์ œ๊ฑฐ(remove)

    ํ•ด๋‹น index๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด O(1),

    ๋ชจ๋ฅด๋Š” ์ƒํƒœ๋ผ๋ฉด ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ง์ ‘ index๋ฅผ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.