October 22, 2020
im-sprint-data-structure λ₯Ό fork λ° clone ν΄ μλ€.
μ΄ν ν΄λΉ νλ‘μ νΈμμ npm install λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μ€νλ¦°νΈμ νμν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉνκ² νλ€.
κ·Έλ¬λ©΄ μ΄μ npm run test:part1 λͺ λ Ήμ΄λ‘ μλμ κ°μ΄ μλ¬ μ¬νμ νμΈνλ©΄μ μ§ννκ² λλ€.
λλ₯Ό μ§ννλμ§?
Stack
λ€μκ³Ό κ°μ methodλ₯Ό ꡬννμΈμ :
push(element) - μμλ₯Ό μ€νμ μ΅μλ¨μ μΆκ°ν©λλ€.
pop() - μ€νμ μ΅μλ¨μμ μμλ₯Ό μ κ±°νκ³ λ°νν©λλ€.
size() - μ€νμ νμ¬ μμ κ°μλ₯Ό λ°νν©λλ€.
Stack μ κΈ°λ₯μ ꡬννκΈ° μν λ΄λΆ λ©μλλ₯Ό ꡬννλ κ³Όμ μ΄λ€.
μ΄μ μμ!
part-1/src/stack.js νμΌμ νμΈνλ©΄ μλ μ½λμ κ°λ€.
class Stack {
constructor() {
this.storage = {}
this.top = 0
}
size() {}
push(element) {}
pop() {}
}
module.exports = Stack
ν΄λμ€λ₯Ό μ μΈνκ³ new ν€μλλ‘ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄λΈ λ€, λ§λ μΈμ€ν΄μ€.push() νΉμ μΈμ€ν΄μ€.pop() λ±μ ν΅ν΄ λ£κ³ λΉΌλ κΈ°λ₯μ λ§λλ κ²μ΄λ€.
κ·ΈλΌ μ΄μ μ§μ§ μμ!
stack μ νμ μ μΆ, λ§μ§λ§μ λ£μ κ²μ λ¨Όμ λΊλ€. μ μλ₯Ό μλ‘ μμμ¬λ¦¬λ λͺ¨μ΅μ λ μ¬λ¦°λ€. λ°μ₯λΉΌλ©΄ μλ₯΄λ₯΄λ§¨μ λμ μλλ€! (νμ§λ§ μμ μμ μ± μ΄λ 맨μμ κΊΌ μνκ±° κ°μ μ λ°μ₯λΉΌμ ꡬ맀νλ€λ κ±°..π₯° λλ§ κ·Έλ°κ°?γ )
MDN 곡μ λ¬Έμμλ class μ constructor λ₯Ό μλμ κ°μ΄ μ μνκ³ μλ€.
constructor λ©μλλ class λ΄μμ κ°μ²΄λ₯Ό μμ±νκ³ μ΄κΈ°ννκΈ° μν νΉλ³ν λ©μλμ
λλ€.
ν΄λμ€λ constructorλΌλ μ΄λ¦μ κ°μ§ νΉλ³ν λ©μλλ₯Ό νλμ©λ§ κ°μ§ μ μμ΅λλ€.
μ½κ² μκ°νλ©΄ μ°λ¦¬κ° μ΄λ€ ν¨μλ₯Ό λ§λ€ λ,
function adder(array) {
let result = []
let count = 0
for (let i = 0; i < array.length; i++) {
// μ΄ν μλ΅...
}
}
ν¨μ λ΄μ result λ count κ°μ μ΄κΈ°ν νλ λ³μλ₯Ό μ μΈν΄ μ£Όμ§ μλκ°?
class μ constructor κ° λ°λ‘ κ·Έλ¬ν μν μ λ΄λΉνλ€κ³ μ΄ν΄νλ©΄ λλ€. λν counstructor λ class λ₯Ό ν΅ν΄ λμ€λ μΈμ€ν΄μ€μ μμ± (μ°¨λ‘ μΉλ©΄ μ°¨μ λΈλλ, μ, μ μ λ±λ±..) μ μ μνλ κ³³μ΄λ€ λΌκ³ μκ°νλ€.
κ·Έλ¦¬κ³ ν΄λμ€μμ μ°μ΄ λμ€λ μΈμ€ν΄μ€κ° this κ° λμ΄, stack μ΄ λ΄κΈΈ κ°μ²΄μΈ storage κ° μ μ λμ΄ μμΌλ©°
storage κ° λΉμ΄ μλ ν μνμ top μ 0 μ΄λ€. μ¦ top μ storage κ°μ²΄ λ΄μ λ€μ΄κ° μμ±μ κ°―μ λ₯Ό μλ―Ένλ€κ³ μ΄ν΄νλ€.
μ΄μ μλλΆν° λμ€λ λ©μλ λ€μ μΈμ€ν΄μ€κ° μ΄λ»κ² λμ νλμ§μ λν μν μ κ·μ νλ€! λΌκ³ μ΄ν΄νλ©΄μ μλλ‘ λ΄λ €κ° 보μ.
μΈμ€ν΄μ€.size()
μμ μ½λλ₯Ό ν΅ν΄ λ΄κ° storage μ push λ pop μ ν΅ν΄ λ£μ μμ±λ€μ κ°―μλ₯Ό 리ν΄νλ€.
μ¦ λκ° μ§μ΄λ£κ³ λΉΌκ³ νλ€κ° μ΄λ? νμ¬ μ¬μ΄μ¦κ° λμ! νλ©΄μ μμλ³Ό λ μ°λ λ©μλμ΄λ€.
return this.top; μ ν΅ν΄ μ΄λ ν μλ£λ₯Ό λ£κ³ λΊ λ, λ³μ top μ΄ νλ 컀μ§κ±°λ μμμ§λ κ²μ 컨νΈλ‘€ ν μ μκ² νλ€.
constructor() { // constructor λ μ΄λ»κ² μ΄ν΄ν΄μΌ μ’μκΉ? class λ₯Ό ν΅ν΄ λμ€λ μΈμ€ν΄μ€μ μμ±μ μ μνλ€ μκ°νλ©΄ λ κΉ?
this.storage = {}; // {0: 'a', 1: 'b'}
this.top = 0; // storage κ° λΉ μνμΌ λ top (κ°μ²΄ λ΄ μμ± κ°―μ?) μ 0 μΈ μνλ₯Ό μ μνλ€.
} // μ΄μ μλμ ν¨μλ€μ μΈμ€ν΄μ€κ° λμνλ μν μ κ·μ νλ€!
size() {
return this.top; // push λλ pop μ μν΄ top μ κ°μ΄ λ°λκ² λλ€.
}
μΆμΈ‘컨λ μ΄λ€ μμ± (μλ£) μ storage λΌλ κ°μ²΄μ μ§μ΄ λ£λ (push) κΈ°λ₯μ νλ λ©μλ μΌ κ²μ΄λ€.
μ°λ¦¬λ κ°μ²΄ μμ κ°μ λ£λ λ°©λ²μ μκ³ μκΈ° λλ¬Έμ
this.storage[this.top] = element
storage κ°μ²΄μ top μ key λ‘ ν΄μ (λν΄νΈκ° 0μΌλ‘ λμ΄ μλ€) push λ©μλμ νλΌλ―Έν°λ‘ λ°μμ€λ element λ₯Ό value λ‘ λ£μ΄μ£Όκ² λ§λ λ€.
μ¦ μ²μμ μ¬κ³Όλ₯Ό λ£λλ€κ³ νλ©΄, μμ μ½λλ₯Ό ν΅ν΄ μλμ κ°μ΄ storage μ ν€κ° 0μΈ μ¬κ³Όκ° λ€μ΄κ° μκ² λλ€.
{ 0: 'π' }
μ΄μ κ°μ²΄ storage μμ μ΄λ€ μμ±μ΄ νλ! λ€μ΄κ°λ€. νλ! νλ! κ·Έλ¬λ©΄ μκΉ μμμ κ·μ ν top μ κ°μ²΄ λ΄ μμ±μ κ°μλ₯Ό μλ―Ένλ€κ³ νκ³ , size() λ©μλμ μ°λλλ€κ³ νμ§ μμλκ°? μ°λνλ €λ©΄ μ΄λ»κ²?
storage μ νλ λ€μ΄κ°μΌλ top λ 0 μμ 1λ‘ λ°λμ΄μΌμ§ μμκΉ?
this.top++ // νλ λ€μ΄κ°λ©΄ κ°μ²΄ λ΄μ μμ±μ΄ νλ μ¦κ° νλ€κ³ μλ €μ€λ€!
λ§μ§λ§μΌλ‘ μ¬κ³Όλ₯Ό λ£μμΌλ λ£μ storage λ₯Ό 보μ¬μ€μΌκ² λ€.
return this.storage
push λ©μλ ꡬνμ μλ μ½λλ‘ λ§λ¬΄λ¦¬ νλ€.
push(element) {
// κ°μ²΄ μμ key: this.top, value: element
this.storage[this.top] = element; // μ΅μ΄ λΉ κ°μ²΄μ { 0: 'π' } λ₯Ό λ£κ³ ,
this.top++; // κ°μ²΄ λ΄μ μμ±μ΄ νλ μ¦κ° νλ€κ³ μλ €μ€λ€!
return this.storage; // κ·Έλ¦¬κ³ { 0: 'π' } λ₯Ό 리ν΄ν΄μ 보μ¬μ€λ€.
}
ν리 μ½μ€μμ λ°°μ΄μ 곡λΆνλ©΄μ push(), pop(), uhshift() λ±μ νμ΅ν΄ λ΄€μλ€.
κ·Έλ pop() μ λ°°μ΄μ 맨 λ€μ μμλ₯Ό μ κ±°νκ³ ,
μ κ±°λ κ·Έ μμλ₯Ό 리ν΄νλ€κ³ 곡λΆνλ€. (λ§€μ° μ€μ) μ΄μ μμνμ.
λΉΌκ³ μΆμ§λ§ λΊκ² μλ€ λΌλ λ¬Έμ₯μ 무μμ λ»ν κΉ? κ·Έ λ§μ λ°λ‘ κ°μ²΄ λ΄μ λ€μ΄ μλ μμ(λ°μ΄ν°) κ° νλλ μλ€λΌλ λ»μ΄λ€.
μ¦, κ°μ²΄ λ΄μ μμ±μ κ°―μλ₯Ό μ μν top μ΄ 0 μ΄λΌλ λ»μ΄ λλ€.
if λ¬Έμ ν΅ν΄ λΉ storage λ₯Ό 리ν΄νλλ‘ νλ€.
pop() {
if(this.top === 0) {
return this.storage; // λ§μ½ κ°μ²΄ λ΄μ μ무κ²λ λ£μκ² μλ€λ©΄, ν΄λΉλ λΉ κ°μ²΄λ₯Ό κ·Έλλ‘ λ¦¬ν΄νλ€.
}
}
μ΄μ push(element) λ₯Ό ν΅ν΄ storage μ λ€μκ³Ό κ°μ μμ±λ€μ΄ λ€μ΄κ° μλ€κ³ μκ°νμ.
// storage μ λ€μ΄κ° μλ λ°μ΄ν° μν.
{0: "π", 1: "π", 2: "π"}
μ¬κ³Όκ° μ € μ²μ λ€μ΄κ°κ³ , μλ°, ν¬λ μμΌλ‘ storage μ λ€μ΄κ° μκ³ κ°μ²΄λ΄ κ°―μ top μ΄ 3μΈ μν μ΄λ€.
μ κΈ°μ key κ° 2 μΈ βπβ λ₯Ό pop() μ ν΅ν΄ λΉΌκ³ μΆμ κ±°λ€.
μΌλ¨ storage κ°μ²΄μμ βπβ λ₯Ό κ°μ Έμ€λ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉ? κ°μ²΄μμ κ°μ κ°μ Έμ€λ κ²!
this.storage[this.top - 1] // κ°―μ top μ΄ 3μ΄κ³ κ±°κΈ°μ -1 μ νλ©΄ 2!
μ¦, storage[2] κ° λμ΄μ storage μ key κ° 2 μΈ κ°μ κ°μ ΈμλΌ λΌλ μλ―Έμ΄λ€.
κ·ΈλΌ βπβ λ₯Ό κ°μ Έμ¬ κ²μ΄λ€!
μ΄μ μ΄κ²μ μ¨λ¨ΉκΈ° μν΄ λ°λ‘ λ³μλ₯Ό μ μΈν΄ λλλ€. κ³Όμ 5-2. μ μ΅μ’ νν μ΄λ€. (μμ§ λμ΄ μλλ€)
// ν μνμμλ storage μ λ§μ§λ§ μμμΈ 2: π λ₯Ό μ§μΉνλ€.
let lastValue = this.storage[this.top - 1]
κ°μ²΄μ μμλ₯Ό μ§μ°λ κ². delete!
delete this.storage[this.top-1]; // μ΄μ π λ₯Ό μ§μλ²λ Έλ€.
// μ§μλ²λ¦¬κ³ λ¨μ storage μ λ°μ΄ν°μ λͺ¨μ΅
{0: "π", 1: "π"}
λ¨κ²¨μ§ λ°μ΄ν°μ κ°―μλ μλ₯Ό 보면 βπβ λ βπβ λ°μ μλ€. μ¦ 2κ°κ° λμλ€.
νμ§λ§ νμ¬ κ°―μλ₯Ό μ μνλ top μ μ¬μ ν 3μΌλ‘ μ μλμ΄ μλ€. ν¬λλ₯Ό λ½μλκΈ° λλ¬Έμ top μ νλ λΉΌμΌ λμ§ μκ² λκ°?
// μ΄μ storage λ΄μλ {0: "π", 1: "π"} λ°μ μκ³ ,
this.top-- // λ°λΌμ top λ 2λ‘ λ°λλ€.
μμμλ μΈκΈνλ―μ΄ pop() μ λ€μ μμλ₯Ό λΉΌκ³ , ν΄λΉ μ κ±°λ μμλ₯Ό 리ν΄νλ€!
return lastValue
κ°λ°μ λꡬμμ ν μ€νΈ ν΄λ³Έ κ·Έλ¦Όμ΄λ€. μΈμ€ν΄μ€λ₯Ό μ΄λ»κ² λ§λλμ§ new ν€μλλ₯Ό μ¬μ©νλ λ±μ λͺ¨μ΅μ μ μ¬ν λ΄μΌ μ’λ€.
class Stack {
// stack μ νμ
μ μΆ, μ μλ₯Ό μλ‘ μμμ¬λ¦¬λ λͺ¨μ΅ μ°μνκΈ°, λ°μ₯λΉΌλ©΄ μλ₯΄λ₯΄κΉ¨μ Έμ μλ¨!
constructor() {
// constructor λ μ΄λ»κ² μ΄ν΄ν΄μΌ μ’μκΉ? class λ₯Ό ν΅ν΄ λμ€λ μΈμ€ν΄μ€μ μμ±μ μ μνλ€ μκ°νλ©΄ λ κΉ?
this.storage = {} // {0: 'a', 1: 'b'}
this.top = 0 // storage κ° λΉ μνμΌ λ top (κ°μ²΄ λ΄ μμ± κ°―μ?) μ 0 μΈ μνλ₯Ό μ μνλ€.
} // μ΄μ μλμ ν¨μλ€μ μΈμ€ν΄μ€κ° λμνλ μν μ κ·μ νλ€!
size() {
return this.top // push λλ pop μ μν΄ top μ κ°μ΄ λ°λκ² λλ€.
}
push(element) {
// κ°μ²΄ μμ key: this.top, value: element
this.storage[this.top] = element // μ΅μ΄ λΉ κ°μ²΄μ { 0: 'π' } λ₯Ό λ£κ³ ,
this.top++ // κ°μ²΄ λ΄μ μμ±μ΄ νλ μ¦κ° νλ€κ³ μλ €μ€λ€!
return this.storage // κ·Έλ¦¬κ³ { 0: 'π' } λ₯Ό 리ν΄ν΄μ 보μ¬μ€λ€.
}
pop() {
if (this.top === 0) {
return this.storage // λ§μ½ κ°μ²΄ λ΄μ μ무κ²λ λ£μκ² μλ€λ©΄, ν΄λΉλ λΉ κ°μ²΄λ₯Ό κ·Έλλ‘ λ¦¬ν΄νλ€.
} // μ΄μ μ΄λ° μνλΌκ³ κ°μ ν΄ λ³΄μ. {0: "π", 1: "π", 2: "π"} , top μ΄ 3μΈ μν.
let lastValue = this.storage[this.top - 1] // ν μνμμλ 2: π λ₯Ό μ§μΉνλ€.
delete this.storage[this.top - 1] // μ΄μ π λ₯Ό μ§μλ²λ Έλ€.
this.top-- // μ΄μ storage λ΄μλ {0: "π", 1: "π"} λ°μ μκ³ λ°λΌμ top λ 2λ‘ λ°λλ€.
return lastValue // pop() μ λ€μ μμλ₯Ό λΉΌκ³ ν΄λΉ μ κ±°λ μμλ₯Ό 리ν΄νλ€.
}
}
module.exports = Stack
λ΄κ° λΈλ‘κ·Έλ₯Ό μ°λ©΄μ μ μ΄ν΄ λμλ κ² κ°λ€.