๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿค– data structures & algorithms

Data Structures & Algorithms with Javascript : Lists

[์ด์ „๊ธ€] 2024.07.17 - [๐Ÿค– data structures & algorithms] - Data Structures & Algorithms with Javascript : Arrays

 

Data Structures & Algorithms with Javascript : Arrays

2024.07.17 - [๐Ÿค– data structures & algorithms] - Data Structures & Algorithms with Javascript Data Structures & Algorithms with Javascript : Intro๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Data Structures & Algorithms with Javascript๋ฅผ ์ถ”์ฒœ๋ฐ›์•„์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‹ค

pyotato-dev.tistory.com

๐Ÿ’ญ ์ €๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ธ Array๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅ ํ•จ์ˆ˜ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ดค๋‹ค.
๐Ÿงพ List ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰์ด๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ”๋žŒ์งํ•˜๋‹ค.
๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์ด๋ฒˆ์—๋Š” ์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…(ADT: abstract data type) ๋ฆฌ์ŠคํŠธ์˜ ์ •์˜์™€ ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

ADT ๋ฆฌ์ŠคํŠธ

List๋ž€?

๋ฆฌ์ŠคํŠธ๋Š” ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ์—ฐ์†์ด๋‹ค. ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์•„์ดํ…œ์€ 'element(์—˜๋ฆฌ๋จผํŠธ)'๋ผ๊ณ  ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์—˜๋ฆฌ๋ฉ˜ํŠธ ๋ฆฌ์ŠคํŠธ๋Š” ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. 

List์˜ ์†์„ฑ

๋ฆฌ์ŠคํŠธ๋Š” ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ์„ ์ง€๋‹Œ๋‹ค. 

๋ฆฌ์ŠคํŠธ์˜ front์™€ end ์‚ฌ์ด์—์„œ next() ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์˜ฎ๊ฒจ๊ฐˆ ์ˆ˜ ์žˆ๊ณ , prev() ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

moveTo(n) ์—ฐ์‚ฐ์„ ํ†ตํ•ด์„œ ๋ฆฌ์ŠคํŠธ์˜ n๋ฒˆ์งธ ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

currPos๋กœ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

ADT List ๊ตฌํ˜„

๋ฆฌ์ŠคํŠธ์˜ ์†์„ฑ์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ๊ณผ ํ•จ์ˆ˜๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฆ„ ๋ถ„๋ฅ˜ ์„ค๋ช…
listSize ์†์„ฑ ๋ฆฌ์ŠคํŠธ ๋‚ด์˜ ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐœ์ˆ˜
pos ์†์„ฑ ๋ฆฌ์ŠคํŠธ ์ƒ์˜ ํ˜„์žฌ ์œ„์น˜
length ์†์„ฑ ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐœ์ˆ˜ ๋ฆฌํ„ด
clear ํ•จ์ˆ˜ ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ ์ œ๊ฑฐ
toString ํ•จ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ string์œผ๋กœ ๋ฆฌํ„ด
getElement ํ•จ์ˆ˜ ํ˜„์žฌ ์œ„์น˜์˜ ์—˜๋ฆฌ๋จผํŠธ ๋ฆฌํ„ด
insert ํ•จ์ˆ˜ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์กด์žฌํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ ๋’ค์— ์ถ”๊ฐ€
append ํ•จ์ˆ˜ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฆฌ์ŠคํŠธ ๋งจ ๋์— ์ถ”๊ฐ€
remove ํ•จ์ˆ˜ ์—˜๋ฆฌ๋จผํŠธ ์‚ญ์ œ
front ํ•จ์ˆ˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž ์—˜๋ฆฌ๋จผํŠธ๋กœ ์„ค์ •
end ํ•จ์ˆ˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ฆฌ์ŠคํŠธ ๋งจ ๋ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์„ค์ •
prev ํ•จ์ˆ˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ ์œ„์น˜๋กœ ์ด๋™
next ํ•จ์ˆ˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ ์œ„์น˜๋กœ ์ด๋™
currPos ํ•จ์ˆ˜ ๋ฆฌ์ŠคํŠธ ์ƒ ํ˜„์žฌ ์œ„์น˜ ๋ฆฌํ„ด
moveTo ํ•จ์ˆ˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ํŠน์ • ์œ„์น˜๋กœ ์ด๋™

 

โ€ผ ์˜ˆ์ œ๋Š” ์ฑ…์˜ ๊ตฌํ˜„์„ ์ฐธ๊ณ ํ•˜์—ฌ ํด๋ž˜์Šค๋กœ ์žฌ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค!!

class List {
    constructor(){
        this.listSize = 0;
        this.pos = 0;
        this.dataStore = [];
    }
	// ์—˜๋ฆฌ๋จผํŠธ์˜ ์œ„์น˜ ํ˜น์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    find(element){
        for(let i=0; i< this.dataStore.length; i++){
            if(this.dataStore[i] == element){
                return i;
            }
        }
        return -1;
    }
    
    // ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ ์ถ”๊ฐ€
    append(element){
        this.dataStore[this.listSize++] = element;
    }
    
    // ๋ฆฌ์ŠคํŠธ์— ์กด์žฌํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ ์‚ญ์ œ
    remove(element){
        let foundAt = this.find(element);
        if(foundAt > -1){
            this.dataStore.splice(foundAt,1);
            --this.listSize;
            return true;
        } return false;
    }
    
    // ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด ๋ฆฌํ„ด
    length(){
        return this.listSize;
    }
    
    // ๋ฆฌ์ŠคํŠธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•œ ํ•˜๋‚˜์˜ string ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด
    toString(){
        return this.dataStore.join(' ,');
    }
    
    // ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํŠน์ • ์œ„์น˜์— ์‚ฝ์ž… 
    insert(element, after){
        let insertPos = this.find(after);
        if(insertPos > -1){
            this.dataStore.splice(insertPos+1,0,element);
            ++this.listSize;
            return true;
        } return false;
    }
    
    // ๋ฆฌ์ŠคํŠธ ๋น„์šฐ๊ธฐ
    clear(){
        delete this.dataStore;
        this.dataStore = [];
        this.listSize = this.pos = 0;
    }
    
    // ๋ฆฌ์ŠคํŠธ์— ์—˜๋ฆฌ๋จผํŠธ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
    contains(element){
        const elementIndex = this.find(element);
 		return elementIndex > -1;
    }

	// ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์œผ๋กœ ์œ„์น˜ ์ด๋™
    front(){
        this.pos = 0;
    }
    // ๋ฆฌ์ŠคํŠธ ๋งจ ๋’ค๋กœ ์œ„์น˜ ์ด๋™
    end(){
        this.pos = this.listSize-1;
    }
    
    // ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ ์œ„์น˜๋กœ ์ด๋™, ๋งจ ์ฒซ ์—˜๋ฆฌ๋จผํŠธ๋ผ๋ฉด ์ œ์ž๋ฆฌ
    prev(){
        if(this.pos > 0){
            --this.pos;
			return true;	// ์ด์ „ ์š”์†Œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ true
        }
		return false;
    }
    
    // ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ ์œ„์น˜๋กœ ์ด๋™, ๋งจ ๋ ์—˜๋ฆฌ๋จผํŠธ๋ผ๋ฉด ์ œ์ž๋ฆฌ
    next(){
        if(this.pos < this.listSize-1){
            ++this.pos;
			return true; // ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์žˆ์„ ๊ฒจ์šฐ true
        }
		return false;
    }
    
    // ํ˜„์žฌ ์œ„์น˜ ๋ฆฌํ„ด
    currPos(){
        return this.pos;
    }
    
    // ํŠน์ • ์œ„์น˜๋กœ ์ด๋™
    moveTo(position){
        this.pos = position;
    }
    
    // ํ˜„์žฌ ์œ„์น˜์˜ ์—˜๋ฆฌ๋จผํŠธ ๋ฆฌํ„ด
    getCurrentElement(){
       return this.dataStore[this.pos];
    }
 
}
const print = (item)=> console.log(item);

const alphabets = new List();
alphabets.append('a');
alphabets.append('A');
alphabets.append('b');

 

๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

const print = (item)=> console.log(item);

const alphabets = new List();
alphabets.append('a');
alphabets.append('A');
alphabets.append('b');
print(alphabets.toString()); // a ,A ,b
print(alphabets.getCurrentElement()); // a
alphabets.moveTo(2);
print(alphabets.currPos()); // 2
alphabets.prev();
print(alphabets.currPos()); // 1
alphabets.insert('added','a'); 
print(alphabets.toString()); // a ,added ,A ,b
alphabets.remove('added');
print(alphabets.toString()); // a ,A ,b
print(alphabets.currPos()); // 1
alphabets.next();
print(alphabets.currPos()); // 2
alphabets.clear();
print(alphabets.toString()); // ''

 

๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด iterator์˜ ํŠน์ง•์„ ์—ฟ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Iterator

iterator๋Š” list ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ ์ €์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  front(), end(), prev(), next()์™€ currPos()๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. iterator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด  ๋ฆฌ์ŠคํŠธ ์—˜๋ฆฌ๋จผํŠธ ์ ‘๊ทผ ์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ฑฑ์ •์„ ์•ˆ ํ•ด๋„ ๋˜๊ณ , iterator๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์ง€ ์•Š๊ณ ๋„ list๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฆฌ์ŠคํŠธ ์ˆœํšŒ

// ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
alphabets.front(); // ๋ฆฌ์ŠคํŠธ ์ฒซ ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์‹œ์ž‘
while (alphabets.currPos() < alphabets.length()) {
    print(alphabets.getCurrentElement());
    if (!alphabets.next()) {
        break;
    }
}

// ๋ฆฌ์ŠคํŠธ ์—ญ์œผ๋กœ ์ˆœํšŒ
alphabets.end(); 
while (alphabets.currPos() >= 0) {
    print(alphabets.getCurrentElement());
    if (!alphabets.prev()) {
        break;
    }
}

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ”ง ์˜ค๋Š˜์€ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์‚ดํŽด๋ดค๋‹ค. 
๐Ÿ€ ์ฑ…์— ์˜ค๋ฅ˜? ๊ฐ€ ๋งŽ์•˜๋‹ค. ์•ˆ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ, ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง€๋Š” ์ˆœํšŒ ์ฝ”๋“œ.. ์˜คํžˆ๋ ค ๊ฐœ๋… ํ‹€๋งŒ ๊ฐ€์ ธ๊ฐ€๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋‹ˆ๊นŒ ๋Ÿญํ‚ค๋น„ํ‚ค์ž–์•„!

 


๐Ÿ“š Reference

- Data Structures and Algorithms Using Javaโ€ Script by Michael McMillian (O’Reilly). Copyright 2014 Michael McMillan, 978-1-449-36493-9