with JavaScripts Study Days 8

with JavaScripts Study Days 8

210508 ν† μš”μΌ 8일차

# 5~7일차 볡슡

  • λ¦¬μŠ€νŠΈλŠ” μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” ν”„λ‘œνΌν‹°(front, end)κ°€ μžˆλ‹€.
  • next()Β ν•¨μˆ˜λ‘œ 리슀트의 ν˜„μž¬ μš”μ†Œμ—μ„œ λ‹€μŒ μš”μ†Œλ‘œ 이동할 수 μžˆλ‹€.
  • prev()Β ν•¨μˆ˜λ‘œ ν˜„μž¬ μš”μ†Œμ—μ„œ 이전 μš”μ†Œλ‘œ 이동할 수 μžˆλ‹€.
  • moveTo(n)Β ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ n 번째 μœ„μΉ˜λ‘œ ν•œ λ²ˆμ— 이동할 수 μžˆλ‹€.
  • currPos()Β ν•¨μˆ˜λŠ” 리슀트의 ν˜„μž¬ μœ„μΉ˜λ₯Ό 가리킨닀.
  • List 클래슀 κ΅¬ν˜„
μƒμ„±μž ν•¨μˆ˜
function List() {
    this.listSize = 0;
    this.pos = 0;
    this.dataStore = [];
    this.clear = clear;
    this.find = find;
    this.toString = toString;
    this.insert = insert;
    this.append = append;
    this.remove = remove;
    this.front = front;
    this.end = end;
    this.prev = prev;
    this.next = next;
    this.length = length;
    this.currPos = currPos;
    this.moveTo = moveTo;
    this.getElement = getElement;
    this.contains = contains;
}
  • Append : λ¦¬μŠ€νŠΈμ— μš”μ†Œ μΆ”κ°€(listSize μœ„μΉ˜μ— μš”μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€.)
function append(element) {
    this.dataStore[this.listSize++] = element;
}
  • Find : 리슀트의 μš”μ†Œ 검색(length ν•¨μˆ˜ ν•„μš”, 인덱슀 κ°’ λ°˜ν™˜)
function find(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return i;
        }
    }
    return -1;
}
  • Remove : 리슀트의 μš”μ†Œ μ‚­μ œ
// remove() : find()의 λ°˜ν™˜κ°’μ„ splice ν•¨μˆ˜μ— λ„˜κ²¨μ£Όμ–΄ μ›ν•˜λŠ” μš”μ†Œλ₯Ό μ‚­μ œν•œ λ‹€μŒ dataStore 배열을 μ—°κ²°ν•œλ‹€. μš”μ†Œλ₯Ό μ‚­μ œν•˜λ©΄ true, λͺ»ν•˜λ©΄ false λ°˜ν™˜function remove(element) {
    let foundAt = this.find(element);
    if (foundAt > -1) {
        this.dataStore.splice(foundAt, 1);
        --this.listSize;
        return true;
    }
    return false;
}
(splice의 두 번째 μΈμžμ— 0을 μ£Όλ©΄ μš”μ†Œ μΆ”κ°€, 1 이상은 숫자만큼 μš”μ†Œλ₯Ό μ‚­μ œν•œλ‹€.)
  • Length : 리슀트의 μš”μ†Œ 개수
function length() {
    return this.listSize;
}
  • toString : 리슀트의 μš”μ†Œ 확인
function toString(){
	return this.dataStore;
}
  • Insert : λ¦¬μŠ€νŠΈμ— μš”μ†Œ μ‚½μž…(κΈ°μ‘΄ μš”μ†Œ 뒀에 μƒˆλ‘œμš΄ μš”μ†Œ μ‚½μž…. find둜 κΈ°μ‘΄ μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό μ°Ύμ•„ μˆ˜ν–‰ν•œλ‹€.)
function 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 : 배열을 μ‚­μ œν•œ λ‹€μŒ 빈 배열을 λ‹€μ‹œ λ§Œλ“ λ‹€. listSize, pos도 0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.
function clear() {
    delete this.dataStore;
    this.dataStore.length = 0;
    this.listSize = this.pos = 0;
}
  • contains : λ¦¬μŠ€νŠΈμ— νŠΉμ • 값이 μžˆλŠ”μ§€ νŒλ‹¨(true, false)
function contains(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return true;
        }
    }
    return false;
}
  • iterator : List 클래슀의 λ‚΄λΆ€ μ €μž₯μ†Œλ₯Ό 직접 μ°Έμ‘°ν•˜μ§€ μ•Šκ³  리슀트λ₯Ό 탐색할 수 μžˆλ‹€. front, end, prev, next, currPosλ₯Ό μ΄μš©ν•΄ κ΅¬ν˜„ν•  수 μžˆλ‹€.
λ°°μ—΄μ˜ μΈλ±μŠ€μ— λΉ„ν•΄ μž₯점은 μ•„λž˜μ™€ κ°™λ‹€.
  • 리슀트 μš”μ†Œμ— μ ‘κ·Όν•  λ•ŒΒ λ‚΄λΆ€ 데이터 μ €μž₯μ†Œκ°€ 무엇인지 걱정할 ν•„μš”κ°€ μ—†λ‹€.
  • λ¦¬μŠ€νŠΈμ— μƒˆ μš”μ†Œλ₯Ό μΆ”κ°€ν–ˆμ„ λ•Œ ν˜„μž¬ μΈλ±μŠ€κ°€ μ“Έλͺ¨ μ—†λŠ” 값이 λ˜λŠ” 반면 반볡자λ₯Ό μ΄μš©ν•˜λ©΄ λ¦¬μŠ€νŠΈκ°€ λ°”λ€Œμ–΄λ„ 반볡자λ₯Ό κ°±μ‹ ν•  ν•„μš”κ°€ μ—†λ‹€.
  • List ν΄λž˜μŠ€μ— μ‚¬μš©ν•˜λŠ”λ°μ΄ν„° μ €μž₯μ†Œμ˜ μ’…λ₯˜κ°€ 달라져도 이전과 같은 λ°©μ‹μœΌλ‘œ μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€.
for (names.front(); names.currPos() < names.length(); names.next()) {
    console.log(names.getElement);
}
ν˜„μž¬ μœ„μΉ˜λ₯Ό 리슀트 μ•žμœΌλ‘œ μ„€μ •(front())ν•œλ‹€. 그리고 currPos() κ°€ 리슀트 길이보닀 μž‘μ„ λ•Œ 루프λ₯Ό λ°˜λ³΅ν•œλ‹€. 루프λ₯Ό 돌 λ•Œλ§ˆλ‹€ next()둜 ν•œ μš”μ†Œμ”© μ „μ§„ν•œλ‹€.

CH3 리슀트

3.5 μ—°μŠ΅λ¬Έμ œ

#1 ν˜„μž¬ 리슀트의 λͺ¨λ“  μš”μ†Œλ³΄λ‹€ 클 λ•Œλ§Œ μš”μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€. μ—¬κΈ°μ„œ ν¬λ‹€λŠ” μ˜λ―ΈλŠ” 숫자일 λ•ŒλŠ” 크기λ₯Ό λΉ„κ΅ν•˜κ³ , ν…μŠ€νŠΈμΌ λ•ŒλŠ” μ•ŒνŒŒλ²³μˆœμœΌλ‘œ λ‚˜μ€‘μ„ μ˜λ―Έν•œλ‹€.

# κ΅¬ν˜„

ν˜„μž¬ λ¦¬μŠ€νŠΈλ³΄λ‹€ λͺ¨λ“  μš”μ†Œκ°€ 클 λ•Œλ§Œ μš”μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” ν•¨μˆ˜μ΄λ―€λ‘œ λͺ¨λ“  μš”μ†Œλ₯Ό νƒμƒ‰ν•˜λŠ” ν•¨μˆ˜κ°€ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν–ˆλ‹€.
find ν•¨μˆ˜λŠ” μ‚½μž…(μΆ”κ°€κ°€ μ•„λ‹ˆλΌ μ‚½μž…μ΄λΌκ³  ν–ˆμœΌλ―€λ‘œ insert() ν•¨μˆ˜)을 μœ„ν•΄ μΆ”κ°€ν•΄λ‘μ—ˆλ‹€.
λͺ¨λ“  μš”μ†Œλ³΄λ‹€ μ‚½μž…ν•˜λ €λŠ” μš”μ†Œκ°€ 큰지 ν™•μΈν•˜μ—¬ λκΉŒμ§€ ν™•μΈν–ˆμ„ λ•Œ return trueλ₯Ό λ°˜ν™˜ν•˜κ³  쀑간에 μ‚½μž…ν•˜λ €λŠ” μš”μ†Œλ³΄λ‹€ 큰 μš”μ†Œκ°€ μ‘΄μž¬ν•  경우 falseλ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ bigger()을 κ΅¬ν˜„ν–ˆλ‹€.
bigger() ν•¨μˆ˜ κ΅¬ν˜„
notion image
insertBigger() ν•¨μˆ˜ κ΅¬ν˜„
// # : ν˜„μž¬ 리슀트의 λͺ¨λ“  μš”μ†Œλ³΄λ‹€ 클 λ•Œλ§Œ μš”μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€. μ—¬κΈ°μ„œ ν¬λ‹€λŠ” μ˜λ―ΈλŠ” 숫자일 λ•ŒλŠ” 크기λ₯Ό λΉ„κ΅ν•˜κ³ , ν…μŠ€νŠΈμΌ λ•ŒλŠ” μ•ŒνŒŒλ²³μˆœμœΌλ‘œ λ‚˜μ€‘μ„ μ˜λ―Έν•œλ‹€.function List() {
    this.listSize = 0;
    this.pos = 0;
    this.dataStore = [];
    this.append = append;
    this.length = length;
    this.find = find;
    this.insertBigger = insertBigger;
}

function length() {
    return this.listSize;
}

function append(element) {
    this.dataStore[this.listSize++] = element;
}

function find(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return i;
        }
    }
    return -1;
}

let nums = new List();
nums.append(1);
nums.append(2);
nums.append(3);
nums.append(4);
nums.append(5);
nums.append(6);

function bigger(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        console.log(this.dataStore[i], element);

        if (this.dataStore[i] >= element) {
            return false;
        }
    }
    return true;
}

function insertBigger(element, after) {
// μ‚½μž… ν•¨μˆ˜μ΄λ―€λ‘œ insert와 λΉ„μŠ·ν•œ ꡬ쑰if (bigger(element)) {
        let insertPos = this.find(after);
        if (insertPos > -1) {
            this.dataStore.splice(insertPos + 1, 0, element);
            ++this.listSize;

            return;
        }
    } else {
        console.log(
            "fail : 리슀트의 μš”μ†Œ 쀑에 ν•΄λ‹Ή μš”μ†Œλ³΄λ‹€ 큰 μš”μ†Œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. "
        );

        return;
    }
}
nums.insertBigger(7, 2);
console.log(nums.dataStore);
notion image
μ—¬κΈ°μ„œ ν…μŠ€νŠΈμΌ 경우 μ•ŒνŒŒλ²³ 순으둜 λ‚˜μ€‘μΈ κ²ƒμœΌλ‘œ νŒλ‹¨ν•΄μ•Ό ν•˜λ―€λ‘œ μš°μ„  ν…μŠ€νŠΈμΈμ§€ μˆ«μžμΈμ§€λ₯Ό ꡬ별할 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ˜€λ‹€.
function check(num) {
    if (isNaN(num) == true) {
        return true;
    } else {
        return false;
    }
}
check() ν•¨μˆ˜μ—λŠ” isNaN λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ˜€λŠ”λ° Not-a-NumberλΌλŠ” 뜻으둜 μˆ«μžκ°€ μ•„λ‹Œ 경우 trueλ₯Ό λ°˜ν™˜ν•΄μ€€λ‹€.
그런데 sort() ν•¨μˆ˜μ˜ κ²½μš°μ—λŠ” compare() ν•¨μˆ˜λ₯Ό 두어 숫자 비ꡐλ₯Ό μˆ˜ν–‰ν•΄μ•Ό μ œλŒ€λ‘œ 정렬이 λ˜λŠ” 것과 ν˜Όλ™ν•˜μ—¬ λΉ„κ΅μ—°μ‚°μžλ‘œ λΉ„κ΅ν•˜λŠ” κ²½μš°μ—λŠ” λ¬Έμžμ—΄μ€ μ•ŒνŒŒλ²³μˆœμœΌλ‘œ, μˆ«μžλŠ” 숫자 크기순으둜 λΉ„κ΅ν•΄μ€€λ‹€λŠ” 것을 λ’€λŠ¦κ²Œ μ•Œκ²Œ λ˜μ—ˆλ‹€.
check() ν•¨μˆ˜λ₯Ό λ”°λ‘œ μΆ”κ°€ν•  ν•„μš”κ°€ μ—†μ–΄μ‘Œκ³  μ•„λž˜μ™€ 같이 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ˜€λ‹€.

# 전체 μ½”λ“œ

// # : ν˜„μž¬ 리슀트의 λͺ¨λ“  μš”μ†Œλ³΄λ‹€ 클 λ•Œλ§Œ μš”μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€. μ—¬κΈ°μ„œ ν¬λ‹€λŠ” μ˜λ―ΈλŠ” 숫자일 λ•ŒλŠ” 크기λ₯Ό λΉ„κ΅ν•˜κ³ , ν…μŠ€νŠΈμΌ λ•ŒλŠ” μ•ŒνŒŒλ²³μˆœμœΌλ‘œ λ‚˜μ€‘μ„ μ˜λ―Έν•œλ‹€.function List() {
    this.listSize = 0;
    this.pos = 0;
    this.dataStore = [];
    this.append = append;
    this.length = length;
    this.find = find;
    this.bigger = bigger;
    this.insertBigger = insertBigger;
}

function length() {
    return this.listSize;
}

function append(element) {
    this.dataStore[this.listSize++] = element;
}

function find(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return i;
        }
    }
    return -1;
}

function bigger(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        console.log(this.dataStore[i], element);

        if (this.dataStore[i] >= element) {
            return false;
        }
    }
    return true;
}

function insertBigger(element, after) {
    if (this.bigger(element)) {
        let insertPos = this.find(after);
        if (insertPos > -1) {
            this.dataStore.splice(insertPos + 1, 0, element);
            ++this.listSize;
            console.log("리슀트 μš”μ†Œ μ‚½μž… 성곡!");
            return;
        }
    } else {
        console.log(
            "fail : 리슀트의 μš”μ†Œ 쀑에 ν•΄λ‹Ή μš”μ†Œλ³΄λ‹€ 큰 μš”μ†Œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. "
        );
        return;
    }
}
// # : 숫자인 경우let nums = new List();
nums.append(1);
nums.append(2);
nums.append(3);
nums.append(4);
nums.append(5);
nums.append(6);
nums.insertBigger(2, 2);
console.log(nums.dataStore);

// # : ν…μŠ€νŠΈμΈ 경우let names = new List();
names.append("C");
names.append("R");
names.append("Cy");
names.append("J");
names.append("B");
names.append("D");
names.insertBigger("A", "B");
console.log(names.dataStore);
notion image

#2 ν˜„μž¬ 리슀트의 λͺ¨λ“  μš”μ†Œλ³΄λ‹€ μž‘μ„ λ•Œλ§Œ μš”μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€.

λͺ¨λ“  μš”μ†Œλ³΄λ‹€ μž‘μ„ λ•Œμ΄λ―€λ‘œ λΉ„κ΅μ—°μ‚°μžλ₯Ό λ°˜λŒ€λ‘œ λ°”κΎΈμ–΄ μ•„λž˜μ²˜λŸΌ κ΅¬ν˜„ν•˜μ˜€λ‹€.

# 전체 μ½”λ“œ

function List() {
    this.listSize = 0;
    this.pos = 0;
    this.dataStore = [];
    this.append = append;
    this.length = length;
    this.find = find;
    this.smaller = smaller;
    this.insertSmaller = insertSmaller;
}

function length() {
    return this.listSize;
}

function append(element) {
    this.dataStore[this.listSize++] = element;
}

function find(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        if (this.dataStore[i] == element) {
            return i;
        }
    }
    return -1;
}

function smaller(element) {
    for (let i = 0; i < this.dataStore.length; ++i) {
        console.log(this.dataStore[i], element);

        if (this.dataStore[i] <= element) {
            return false;
        }
    }
    return true;
}

function insertSmaller(element, after) {
    if (this.smaller(element)) {
        let insertPos = this.find(after);
        if (insertPos > -1) {
            this.dataStore.splice(insertPos + 1, 0, element);
            ++this.listSize;
            console.log("리슀트 μš”μ†Œ μ‚½μž… 성곡!");
            return;
        }
    } else {
        console.log(
            "fail : 리슀트의 μš”μ†Œ 쀑에 ν•΄λ‹Ή μš”μ†Œλ³΄λ‹€ μž‘μ€ μš”μ†Œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. "
        );
        return;
    }
}
// # : 숫자인 경우let nums = new List();
nums.append(1);
nums.append(2);
nums.append(3);
nums.append(4);
nums.append(5);
nums.append(6);
nums.insertSmaller(2, 2);
console.log(nums.dataStore);

// # : ν…μŠ€νŠΈμΈ 경우let names = new List();
names.append("C");
names.append("R");
names.append("Cy");
names.append("J");
names.append("B");
names.append("D");
names.insertSmaller("A", "B");
console.log(names.dataStore);
notion image

#3 μ‚¬λžŒμ˜ 이름과 성별을 μ €μž₯ν•˜λŠ” Person 클래슀λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€. μ΅œμ†Œν•œ 10개의 Person 객체λ₯Ό ν¬ν•¨ν•˜λŠ” 리슀트λ₯Ό λ§Œλ“œμ‹œμ˜€. λ¦¬μŠ€νŠΈμ—μ„œ 같은 성별을 가진 μ‚¬λžŒμ„ λͺ¨λ‘ 좜λ ₯ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€.

리슀트 λ‚΄λΆ€λŠ” 데이터 μ €μž₯μ†Œκ°€ λ°°μ—΄λ‘œ λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— ch2μ—μ„œ λ°°μ› λ˜ λ°°μ—΄ ν•¨μˆ˜μ€‘μ— filterλ₯Ό μ΄μš©ν•΄μ„œ μ›ν•˜λŠ” 객체 μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” λ°°μ—΄λ§Œμ„ λ°˜ν™˜ν•˜λ„λ‘ μƒκ°ν–ˆλ‹€. (filterλŠ” 주어진 쑰건을 ν†΅κ³Όν•˜λŠ” λͺ¨λ“  μš”μ†Œλ₯Ό λͺ¨μ•„ λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.)
// # : μ‚¬λžŒμ˜ 이름과 성별을 μ €μž₯ν•˜λŠ” Person 클래슀λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€. μ΅œμ†Œν•œ 10개의 Person 객체λ₯Ό ν¬ν•¨ν•˜λŠ” 리슀트λ₯Ό λ§Œλ“œμ‹œμ˜€. λ¦¬μŠ€νŠΈμ—μ„œ 같은 성별을 가진 μ‚¬λžŒμ„ λͺ¨λ‘ 좜λ ₯ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€.function List() {
    this.listSize = 0;
    this.dataStore = [];
    this.append = append;
    this.length = length;
    this.sameSex = sameSex;
}

function length() {
    return this.listSize;
}

function append(element) {
    this.dataStore[this.listSize++] = element;
}

let persons = new List();

persons.append({ name: "F", sex: "female" });
persons.append({ name: "G", sex: "female" });
persons.append({ name: "H", sex: "female" });
persons.append({ name: "I", sex: "female" });
persons.append({ name: "J", sex: "female" });
persons.append({ name: "A", sex: "male" });
persons.append({ name: "B", sex: "male" });
persons.append({ name: "C", sex: "male" });
persons.append({ name: "D", sex: "male" });
persons.append({ name: "E", sex: "male" });

function sameSex(sex) {
    return this.dataStore.filter((x) => {
        if (x.sex === sex) {
            return x;
        }
    });
}

console.log(persons.sameSex("female"));
console.log("\n");
console.log(persons.sameSex("male"));
notion image

CH4 μŠ€νƒ

λ¦¬μŠ€νŠΈλŠ” 특히 데이터 μ €μž₯ μˆœμ„œκ°€ μ€‘μš”ν•˜μ§€ μ•Šκ±°λ‚˜, μ €μž₯된 데이터λ₯Ό 검색할 ν•„μš”κ°€ 없을 λ•Œ μš”κΈ΄ν•˜λ‹€. 일뢀 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 일반 λ¦¬μŠ€νŠΈλ³΄λ‹€ μ’€ 더 λ³΅μž‘ν•œ μžλ£Œκ΅¬μ‘°κ°€ ν•„μš”ν•  λ•Œκ°€ μžˆλ‹€.
λ¦¬μŠ€νŠΈμ™€ λΉ„μŠ·ν•˜μ§€λ§Œ 더 λ‹€μ–‘ν•œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” μŠ€νƒμ€ κ°€μž₯ μœ—λΆ€λΆ„μ—μ„œλ§Œ 자료의 μΆ”κ°€/μ‚­μ œκ°€ μΌμ–΄λ‚˜λ―€λ‘œ 싀행속도가 λΉ λ₯΄κ³  κ΅¬ν˜„μ΄ μ‰¬μš΄ 효율적인 μžλ£Œκ΅¬μ‘°λ‹€.

4.1 μŠ€νƒ λ™μž‘

μŠ€νƒμ€ μš”μ†Œ 리슀트둜 κ΅¬μ„±λ˜λ©° Top이라 λΆˆλ¦¬λŠ” ν•œμͺ½ 끝으둜만 μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€. ν›„μž…μ„ μΆœ(Last-In, First-Out)이닀.
ν›„μž…μ„ μΆœμ΄λΌλŠ” νŠΉμ„± λ•Œλ¬Έμ— λ°‘λ°”λ‹₯에 μžˆλŠ” μš”μ†Œμ— μ ‘κ·Όν•˜λ €λ©΄ λͺ¨λ“  μš”μ†Œλ₯Ό μ œκ±°ν•˜λŠ” 수 밖에 μ—†λ‹€.
보톡 μŠ€νƒμ€ Top에 μžˆλŠ” μš”μ†Œλ₯Ό ν™•μΈν•˜λŠ” κΈ°λŠ₯도 μ œκ³΅ν•œλ‹€. popμœΌλ‘œλ„ 확인할 수 μžˆμ§€λ§Œ μš”μ†Œλ₯Ό κΊΌλ‚΄κΈ° λ•Œλ¬Έμ΄λ‹€. peek으둜 μš”μ†Œλ₯Ό μ œκ±°ν•˜μ§€ μ•Šκ³  λ‚΄μš©λ§Œ ν™•μΈν•œλ‹€.
clear ν”„λ‘œνΌν‹°λŠ” μŠ€νƒμ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. lengthλŠ” ν¬ν•¨λœ μš”μ†Œμ˜ 수λ₯Ό μ €μž₯ν•œλ‹€. emptyλŠ” μŠ€νƒμ— μš”μ†Œκ°€ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ•Œλ €μ€€λ‹€.(lengthλ‘œλ„ 확인할 수 μžˆλ‹€.)

4.2 μŠ€νƒ κ΅¬ν˜„

function Stack() {
    this.dataStore = [];
    this.top = 0;
    this.push = push;
    this.pop = pop;
    this.peek = peek;
    this.clear = clear;
    this.length = length;
}

function push(element) {
// this.top++μ΄λ―€λ‘œ μš”μ†Œ μΆ”κ°€ν›„ top을 1 μ¦κ°€μ‹œν‚¨λ‹€.this.dataStore[this.top++] = element;
}
// λ°˜ν™˜ν•˜κ³  top λ³€μˆ˜κ°’μ„ κ°μ†Œμ‹œν‚¨λ‹€.function pop() {
    return this.dataStore[--this.top];
}
// this.top-1이면 κ°€μž₯ 우츑(μŠ€νƒμƒ λ§¨μœ„)의 μš”μ†Œλ₯Ό 가리킨닀.function peek() {
    return this.dataStore[this.top - 1];
}

function length() {
    return this.top;
}

function clear() {
    this.top = 0;
}

let s = new Stack();
s.push("D");
s.push("R");
s.push("B");
console.log("length: " + s.length());
console.log(s.peek());
let popped = s.pop();
console.log("The popped element is : " + popped);
console.log(s.peek());
s.push("C");
console.log(s.peek());
s.clear();
console.log("length: " + s.length());
console.log(s.peek());
s.push("C");
console.log(s.peek());
notion image
peek() ν•¨μˆ˜λŠ” top-1 μœ„μΉ˜μ˜ μš”μ†Œμ— μ ‘κ·Όν•΄ μŠ€νƒμ˜ 탑 μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€. (λ§Œμ•½ μŠ€νƒμ˜ μš”μ†Œκ°€ 3개라면 top(length)은 3일 것이고 μœ„ μ½”λ“œμ— λ”°λ₯΄λ©΄ λ°°μ—΄μ˜ κ°€μž₯ 였λ₯Έμͺ½ 값이 κ°€μž₯ μœ— κ°’μœΌλ‘œ λ³Ό 수 μžˆλ‹€. peek()을 보면 this.top -1 의 μΈλ±μŠ€μ—μ„œ λ‚΄μš©μ„ ν™•μΈν•˜κ³  μžˆλŠ”λ° μ‹€μ œ μš”μ†Œμ˜ κ°œμˆ˜κ°€ 3이라면 κ°€μž₯ 였λ₯Έμͺ½(μŠ€νƒμœΌλ‘œλŠ” 맨 μœ„)에 μžˆλŠ” μš”μ†Œλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ this.top-1둜 μ§€μ •ν•œ 것이닀.

4.3 Stack 클래슀 μ΄μš©ν•˜κΈ°

4.3.1 진법 λ³€ν™˜

1. n의 κ°€μž₯ 였λ₯Έμͺ½ μˆ«μžλŠ” n%b이닀. 이 값을 μŠ€νƒμ— μΆ”κ°€ν•œλ‹€.
=> s.push(num % base);
2. n을 n/b으둜 μΉ˜ν™˜ν•œλ‹€.
=>Β num = Math.floor((num /= base)); // Math.floorλŠ” μ†Œμˆ˜κ°’μ΄ μ‘΄μž¬ν•  λ•Œ μ†Œμˆ˜κ°’μ„ λ²„λ €μ£ΌλŠ” κΈ°λŠ₯
3. n=0 이 되고 λ‚˜λ¨Έμ§€κ°€ 없을 λ•ŒκΉŒμ§€ 1번, 2번 과정을 λ°˜λ³΅ν•œλ‹€.
=>Β do { } while( num > 0 ) ;
4. μŠ€νƒμ— μ €μž₯된 숫자λ₯Ό λͺ¨λ‘ κΊΌλ‚΄ λ³€ν™˜λœ 숫자 λ¬Έμžμ—΄μ„ λ§Œλ“ λ‹€.
=>Β while(s.length() > 0 ) { converted += s.pop(); } // s의 μš”μ†Œκ°€ pop을 톡해 쀄어듀닀가 0κ°œκ°€ λ˜λŠ” μˆœκ°„ while문은 μ’…λ£Œλœλ‹€.
return converted;
NOTE : 이 μ•Œκ³ λ¦¬μ¦˜μ€ 2μ§„μˆ˜ ~ 9μ§„μˆ˜ μ‚¬μ΄μ—μ„œλ§Œ μž‘λ™ν•œλ‹€.
function Stack() {
    this.dataStore = [];
    this.top = 0;
    this.push = push;
    this.pop = pop;
    this.peek = peek;
    this.clear = clear;
    this.length = length;
}

function push(element) {
// this.top++μ΄λ―€λ‘œ μš”μ†Œ μΆ”κ°€ν›„ top을 1 μ¦κ°€μ‹œν‚¨λ‹€.this.dataStore[this.top++] = element;
}
// λ°˜ν™˜ν•˜κ³  top λ³€μˆ˜κ°’μ„ κ°μ†Œμ‹œν‚¨λ‹€.function pop() {
    return this.dataStore[--this.top];
}
// this.top-1이면 κ°€μž₯ 우츑(μŠ€νƒμƒ λ§¨μœ„)의 μš”μ†Œλ₯Ό 가리킨닀.function peek() {
    return this.dataStore[this.top - 1];
}

function length() {
    return this.top;
}

function clear() {
    this.top = 0;
}

function mulBase(num, base) {
    let s = new Stack();
    do {
        s.push(num % base);
        num = Math.floor((num /= base));
    } while (num > 0);
    let converted = "";
    while (s.length() > 0) {
        converted += s.pop();
    }
    return converted;
}

let num = 32;
let base = 2;
let newNum = mulBase(num, base);// 32λ₯Ό 2μ§„λ²•μœΌλ‘œ λ³€ν™˜ν•˜κ² λ‹€.console.log(num + " converted to base " + base + " is " + newNum);
num = 125;
base = 8;
newNum = mulBase(num, base);// 125λ₯Ό 8μ§„λ²•μœΌλ‘œ λ³€ν™˜ν•˜κ² λ‹€.console.log(num + " converted to base " + base + " is " + newNum);
notion image

4.3.2. 회문

"racecar"λ‚˜ "A man, a plan, a canal: Panama"(ꡬ두점 λ¬΄μ‹œ), 1001 등이 νšŒλ¬Έμ΄λ‹€.
μŠ€νƒμ„ μ΄μš©ν•˜λ©΄ μ›λž˜ λ¬Έμžμ—΄μ„ μ—­μˆœμœΌλ‘œ, λ§ˆμ§€λ§‰ λ¬ΈμžλŠ” μŠ€νƒμ˜ Top에, 첫 λ¬ΈμžλŠ” μŠ€νƒμ˜ Bottom에 μœ„μΉ˜ν•œλ‹€.
μŠ€νƒμ— λ¬Έμžμ—΄μ„ λͺ¨λ‘ μΆ”κ°€ν–ˆμœΌλ©΄
=>
for (let i = 0; i < word.length; ++i) {

s.push(word[i]);

}
각 문자λ₯Ό λ‹€μ‹œ κΊΌλ‚΄ μƒˆ λ¬Έμžμ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.
=>
    while (s.length() > 0) {
        rword += s.pop();
    }
μ΄λ ‡κ²Œ μ—­μˆœμœΌλ‘œ 바뀐 λ¬Έμžμ—΄κ³Ό μ›λž˜ λ¬Έμžμ—΄μ„ λΉ„κ΅ν•œλ‹€. 비ꡐ κ²°κ³Όκ°€ κ°™μœΌλ©΄ λ¬Έμžμ—΄μ€ νšŒλ¬Έμ΄λ‹€.
=>
if (word == rword) {
        return true;
    } else {
        return false;
    }
function Stack() {
    this.dataStore = [];
    this.top = 0;
    this.push = push;
    this.pop = pop;
    this.peek = peek;
    this.clear = clear;
    this.length = length;
}
function push(element) {
    this.dataStore[this.top++] = element;
}
function pop() {
    return this.dataStore[--this.top];
}
function peek() {
    return this.dataStore[this.top - 1];
}
function length() {
    return this.top;
}
function clear() {
    this.top = 0;
}

function isPalindrome(word) {
    let s = new Stack();
    for (let i = 0; i < word.length; ++i) {
        s.push(word[i]);
    }
    let rword = "";
    while (s.length() > 0) {
        rword += s.pop();
    }
    if (word == rword) {
        return true;
    } else {
        return false;
    }
}

let word = "hello";
if (isPalindrome(word)) {
    console.log(word + " is a palindrome");
} else {
    console.log(word + " is not palindrome");
}
word = "racecar";
if (isPalindrome(word)) {
    console.log(word + " is a palindrome");
} else {
    console.log(word + " is not palindrome");
}

4.3.3. μž¬κ·€

μŠ€νƒμ„ μ΄μš©ν•΄ μž¬κ·€ ν”„λ‘œμ„ΈμŠ€λ₯Ό 흉내낼 수 μžˆλ‹€. νŒ©ν† λ¦¬μ–Ό ν•¨μˆ˜μ˜ μž¬κ·€ κ΅¬ν˜„μ„ μ΄μš©ν•΄ μ–΄λ–»κ²Œ μŠ€νƒμœΌλ‘œ μž¬κ·€λ₯Ό κ΅¬ν˜„ν•˜λŠ”μ§€ 확인할 수 μžˆλ‹€.
function factorial(n) {
    if (n === 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

console.log(factorial(5));
notion image
μŠ€νƒ 이용 :Β 5λΆ€ν„° 1을 μŠ€νƒμœΌλ‘œ μΆ”κ°€ν•œλ‹€.
=>
    while (n > 1) {
        s.push(n--);
    }
루프λ₯Ό λŒλ©΄μ„œ 각 숫자λ₯Ό κΊΌλ‚΄ κ²°κ³Όλ₯Ό κ³±ν•΄κ°€λ©΄ 120이 λ‚˜μ˜¨λ‹€.
=>
let product = 1;
    while (s.length() > 0) {
        product += s.pop();
    }
    return product;
function factorial(n) {
    if (n === 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

function Stack() {
    this.dataStore = [];
    this.top = 0;
    this.push = push;
    this.pop = pop;
    this.length = length;
}
function push(element) {
    this.dataStore[this.top++] = element;
}
function pop() {
    return this.dataStore[--this.top];
}
function length() {
    return this.top;
}

function fact(n) {
    let s = new Stack();
    while (n > 1) {
        s.push(n--);
    }
    let product = 1;
    while (s.length() > 0) {
        product *= s.pop();
    }
    return product;
}

console.log(factorial(5));
console.log(fact(5));
notion image