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
'๐ค data structures & algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Data Structures & Algorithms with Javascript : Linked Lists (0) | 2024.07.21 |
---|---|
Data Structures & Algorithms with Javascript : Queues (0) | 2024.07.20 |
Data Structures & Algorithms with Javascript : Stacks (0) | 2024.07.19 |
Data Structures & Algorithms with Javascript : Arrays (3) | 2024.07.17 |
Data Structures & Algorithms with Javascript : Intro (0) | 2024.07.17 |