๐ข 2. Data Structures
๐ก ์๋ฃ๊ตฌ์กฐ
๋ฐฐ์ด
๋งํฌ๋ ๋ฆฌ์คํธ
์คํ
ํ
ํด์ ํ ์ด๋ธ
๐ซง ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด
- โค๏ธ ํด์ํ ์ด๋ธ (hash table)
ํจ์จ์ ์ธ ํ์์ ์ํ ์๋ฃ๊ตฌ์กฐ๋ก์, key๋ฅผ value ์ ๋์์ํด
์ต์ ์ ๊ฒฝ์ฐ O(n) // n์ ํค์ ๊ฐ์
์ต์ ์ ๊ฒฝ์ฐ O(1)
1) ํค์ ํด์ ์ฝ๋ ๊ณ์ฐ
- ํค์ ์๋ฃํ์ ๋ณดํต int or long
- ํค์ ๊ฐ์ ๋ฌดํ (int ๋ ์ ํ)
2) hash(key) % array_length ๋ฐฉ์์ผ๋ก ํด์ ์ฝ๋ ์ด์ฉํด ๋ฐฐ์ด์ ์ธ๋ฑ์ค ๊ตฌํจ
- ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๊ฐ์ ์ธ๋ฑ์ค ๊ฐ๋ฆฌํฌ ์ ์์
3) ๋ฐฐ์ด์ ๊ฐ ์ธ๋ฑ์ค์๋ ํค์ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ์ฐ๊ฒฐ๋ฆฌ์คํธ ์กด์ฌ
- ํค์ ๊ฐ์ ํด๋น ์ธ๋ฑ์ค์ ์ ์ฅ (๋ฐ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ด์ฉ!)
- ๐ฅ ์ถฉ๋ : ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํค๊ฐ ๊ฐ์ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฑฐ๋, ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ
โ ํค์ ์์ํ๊ธฐ ์ํด์ ์๋ฅผ ๋ฐ๋ณต!
โ ์ฃผ์ด์ง ํค๋ก๋ถํฐ ํด์ ์ฝ๋๋ฅผ ๊ณ์ฐ, ํด์ ์ฝ๋๋ฅผ ์ด์ฉํด ์ธ๋ฑ์ค ๊ณ์ฐ, ํด๋น ํค์ ์์ํ๋ ๊ฐ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ํ์
1 2 3 4 โ ๊ท ํ ์ด์ง ํ์ ํธ๋ฆฌ (balanced binary search tree) : ํ์ ์๊ฐ์ O(logN) : ํฌ๊ธฐ๊ฐ ํฐ ๋ฐฐ์ด์ ๋ฏธ๋ฆฌ ํ ๋นํด ๋์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ ์ ๊ณต๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ : ํค์ ์งํฉ์ ํน์ ์์๋๋ก ์ ๊ทผ ๊ฐ๋ฅ
โค๏ธ ArrayList ์ ๊ฐ๋ณ ํฌ๊ธฐ ๋ฐฐ์ด
- ArrayList
- ๋์ ๊ฐ๋ณ ํฌ๊ธฐ ๊ธฐ๋ฅ ๋ด์ฌ์ ๋ฐฐ์ด์ผ ๋ ์ฌ์ฉ
- ํ์์ ๋ฐ๋ผ ํฌ๊ธฐ๋ฅผ ๋ณํ ๊ฐ๋ฅ
- O(1)์ ์ ๊ทผ ์๊ฐ์ ์ ์ง
- ๋ฐฐ์ด์ด ๊ฐ๋ ์ฐจ๋ฉด, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆผ
- O(n)์ผ๋ก ๋๋ ค์ง์ง๋ง, ์ํ ์ ๋ ฅ ์๊ฐ์ผ๋ก ์ธํด O(1)
- n๊ฐ์ ์์๋ฅผ ์ฝ์ ํ ๋ ์์ ์์ ์ O(n)
- ํ๊ท ์ ์ผ๋ก ๊ฐ ์ฝ์ ์ O(1)
- โค๏ธ StringBuilder
๊ฐ๋ณ ํฌ๊ธฐ ๋ฐฐ์ด์ ์ด์ฉํด์ ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ฌธ์์ด ๋ณต์ฌ
1 2 3 4 5 6 7
String joinWords(String[] words) { StringBuilder sentence = new StringBuilder(); for (String w : words) { sentence.append(w); } return sentence.toString(); }
๐ซง ๋ฒกํฐ ๊ตฌํํ๊ธฐ
โก๏ธ size() - ํญ๋ชฉ์ ๊ฐ์
1
2
3
4
public static void main(String[] args){
ArrayList<Object> sizeTest = new ArrayList<Object>();
System.out.println( sizeTest.size() ); // 0
}
โก๏ธ capacity() - ๋ค์ด๊ฐ ์ ์๋ ํญ๋ชฉ์ ์ต๋ ๊ฐ์
1
2
3
4
5
public static void main(String[] args) {
StringBuffer buff = new StringBuffer(20);
buff.append("GwangJik");
System.out.println("Capacity : " + buff.capacity()); // 20
}
โก๏ธ is_empty()
1
2
3
4
String test = null;
if(test != null && test.isEmpty()) {
System.out.println(test);
}
โก๏ธ at(index) - ์ธ๋ฑ์ค์ ์๋ ํญ๋ชฉ์ ๋๋ ค์ฃผ๊ณ , ์ธ๋ฑ์ค๊ฐ ๋ฒ์ ๋ฐ์ด๋ฉด ์๋ฌ๋ฅผ ๋
1
2
3
4
int digitStr = "456";
// 0๋ฒ์งธ์ ์๋ char ๊ฐ์ ๋ฆฌํด
digitStr.charAt(0) // 4
โก๏ธ push(item)
1
2
var fruit = ["์ฌ๊ณผ", "๋ฐฐ", "ํฌ๋"];
fruit.push("๋ธ๊ธฐ"); // ๋ฐฐ์ด ๋ค์ชฝ์ ๋ฐ์ดํฐ ์ฝ์
["์ฌ๊ณผ", "๋ฐฐ", "ํฌ๋", "๋ธ๊ธฐ"]
โก๏ธ insert(index, item) - index์ item์ ์ฝ์ ํ๊ณ ๊ธฐ์กด ์ธ๋ฑ์ค์ ๊ฐ๋ถํฐ ์ญ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฌํํธ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ArrayListDemo {
public static void main(String[] args)
{
// create an empty list with an initial
// capacity
List<String> list = new ArrayList<String>(5);
// use add() method to initially
// add elements in the list
list.add("Geeks");
list.add("For");
list.add("Geeks");
// Add a new element at index 0
list.add(0, "Hello");
// prints all the elements available in list
for (String str : list) {
System.out.print(str + " ");
}
}
}
// Hello Geeks For Geeks
โก๏ธ prepend(item) - ๋งจ ์์ ์์๋ฅผ ์ฝ์
1
2
3
int[] arr = { 10, 20, 30 };
arr = ArrayUtils.add(arr, 40);
โก๏ธ pop() - ๋ง์ง๋ง ์์๋ฅผ ์ญ์ ํ๊ณ ๊ฐ์ ๋๋ ค์ค๋ค
1
2
var fruit = ["์ฌ๊ณผ", "๋ฐฐ", "ํฌ๋"];
fruit.pop(); // ๋ฐฐ์ด ๋ค์ชฝ์ ๋ฐ์ดํฐ ์ ๊ฑฐ ["์ฌ๊ณผ", "๋ฐฐ"]
โก๏ธ delete(index) - delete item at index, shifting all trailing elements left
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.File; // Import the File class
public class DeleteFile {
public static void main(String[] args) {
File myObj = new File("filename.txt");
if (myObj.delete()) {
System.out.println("Deleted the file: " + myObj.getName());
} else {
System.out.println("Failed to delete the file.");
}
}
}
// Deleted the file: filename.txt
โก๏ธ remove(item) - looks for value and removes index holding it (even if in multiple places)
1
2
3
4
5
6
7
8
9
10
11
String[] fruitsArray = {"apple", "banana", "kiwi", "mango"};
ArrayList<String> fruits = new ArrayList<>(Arrays.asList(fruitsArray));
System.out.println("all: " + fruits.toString());
String returned = fruits.remove(2);
System.out.println("remove(2): " + fruits.toString());
System.out.println("returned: " + returned);
// all: [apple, banana, kiwi, mango]
// remove(2): [apple, banana, mango]
// returned: kiwi
โก๏ธ find(item) - looks for value and returns first index with that value, -1 if not found
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BooleanFindMethodExample1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pattern p=Pattern.compile("java");
Matcher m=p.matcher("HellojavaHellojava");
int c=0;
// finding matching char
while(m.find())
{
c=c+1;
System.out.println("Start position of matching String "+m.start());
System.out.println("End position of Matching String (java) "+m.end());
}
System.out.println(" Number of matches : "+c);
}
}
1
2
3
4
5
6
7
8
9
10
11
Pattern pat = Pattern.compile("์ฌ๊ธฐ์ ์ ๊ท์ ์
๋ ฅ");
ํจํด์ ์ ์ ํ ํ
Matcher match = pat.matcher("์ฌ๊ธฐ์ ์กฐ์ฌํ ๋ฌธ์์ด");
์ ์๋ ํจํด์ ๋งค์น ๋๋ ๊ฐ์ ์ ์ฅํ๋ค.
match.find()
๋งค์น๋ ๊ฐ์ด ์์ผ๋ฉด true ์์ผ๋ฉด false๋ฅผ ๋ฐํํ๋ค.
match.group()
๋งค์น๋ ๊ฐ์ ๋ฐํํ๋ค.
โก๏ธ resize(new_capacity) // private ํจ์
- ์ฉ๋์ด ๊ฝ ์ฐจ๋ฉด, ๊ทธ ๋๋ฐฐ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค.
- item์ ํ๋ ๊บผ๋ผ ๋, ์ฉ๋์ด 1/4์ด๋ผ๋ฉด, ์ฉ๋์ ์ ๋ฐ์ผ๋ก ์ค์ธ๋ค.
๐ซง ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- : ์ฐจ๋ก๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ํํํด์ฃผ๋ ์๋ฃ๊ตฌ์กฐ
๋จ) ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ํน์ ์ธ๋ฑ์ค๋ฅผ ์์ ์๊ฐ์ ์ ๊ทผํ ์ ์๋ค
- (k๋ฒ์งธ ์์๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด ์ฒ์๋ถํฐ k๋ฒ ๋ฃจํ ๋์์ผํจ)
์ฅ) ๋ฆฌ์คํธ์ ์์ ์ง์ ์์ ์์ดํ ์ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ์ฐ์ฐ์ ์์ ์๊ฐ์ ํ ์ ์๋ค
๋จ๋ฐฉํฅ
- ๊ฐ ๋ ธ๋๋ ๋ค์ ๋ ธ๋ ๊ฐ๋ฆฌํด
์๋ฐฉํฅ
- ๊ฐ ๋ ธ๋๋ ๋ค์ ๋ ธ๋์ ์ด์ ๋ ธ๋๋ฅผ ํจ๊ป ๊ฐ๋ฆฌํด
๐ (๋จ๋ฐฉํฅ) ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Node {
Node next = null;
int data;
public Node(int d) {
data = d;
}
void appendToTail(int d) {
Node end = new Node(d);
Node n = this;
while (n.next != null) {
n = n.next;
{
n.next = end;
}
}
๐ (๋จ๋ฐฉํฅ) ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ญ์
1) ๋ ธ๋ n ์ด ์ฃผ์ด์ง๋ฉด, ์ด์ ๋ ธ๋ prev ๋ฅผ ์ฐพ์ prev.next ์ n.next ๊ฐ ๊ฐ๋๋ก ์ค์ ํ๋ค
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ผ ๊ฒฝ์ฐ, n.next๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ธ๋๋ฅผ ๊ฐฑ์ ํ์ฌ n.next.prev ๊ฐ n.prev ๊ฐ ๊ฐ๋๋ก ์ค์
๐ฅ ์ฃผ์
- ๋ ํฌ์ธํธ ๊ฒ์ฌ๋ฅผ ๋ฐ๋์ ํ๋ค
- head์ tail ํฌ์ธํฐ๋ฅผ ๊ฐฑ์ ํ๋ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Node deleteNode(Node head, int d) {
Node n = head;
if (n.data == d) {
return head.next; // head ์์ง์ด๊ธฐ
}
while (n.next != null) {
if (n.next.data == d) {
n.next = n.next.next;
return head; // head ์์ง์ด์ง ์์
}
}
return head;
}
- ๐ Runner (๋ถ๊ฐ ํฌ์ธํฐ)
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ํํ ๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒ
ํ ํฌ์ธํฐ๊ฐ ๋ค๋ฅธ ํฌ์ธํฐ๋ณด๋ค ์์๋๋ก ํ๋ค
- ์์ ํฌ์ธํฐ๋ ๋ค ํฌ์ธํฐ๋ณด๋ค ํญ์ ์ง์ ๋ ๊ฐ์๋งํผ์ ์์ค ์ ์๋ค
- ๋ค ํฌ์ธํฐ๋ฅผ ์ฌ๋ฌ ๋ ธ๋๋ฅผ ํ๋ฒ์ ๋ฐ์ด๋๋๋ก ์ค์ ํ ์ ์๋ค
- ๐ ์ฌ๊ท ๋ฌธ์
์ฌ๊ท ํธ์ถ ๊น์ด๊ฐ n์ผ ๊ฒฝ์ฐ, ํด๋น ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ด๋ O(n) ์ ๊ณต๊ฐ์ ์ฌ์ฉ
๐ซง ๋งํฌ๋ ๋ฆฌ์คํธ ๊ตฌํํ๊ธฐ
โก๏ธ size() - ๋ฆฌ์คํธ ์์ ๋ฐ์ดํฐ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
1
2
LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2,3));
System.out.println(list.size()); //list ํฌ๊ธฐ : 3
โก๏ธ empty() - ๋ฆฌ์คํธ๊ฐ ๋น์ด์๋ค๋ฉด true๋ฅผ ๋ฐํํ๋ค.
1
2
3
4
5
// ๋ฆฌ์คํธ๊ฐ ๋น์๋๊ฐ
template <typename E>
bool SLinkedList<E>::empty() const{
return head == NULL;
}
โก๏ธ value_at(index) - index๋ฒ์งธ ์์น์ value์ ๋ฐํํ๋ค. (๊ฐ์ฅ ์์ 0๋ถํฐ ์์ํ๋ค.)
1
2
3
4
5
# declaring array
a = [18, 22, 33, nil, 5, 6]
puts "values_at() method form : #{a.values_at(2, 4)}\n\n"
// values_at() method form : [33, 5]
โก๏ธ push_front(value) - ๊ฐ์ฅ ์์ value๋ฅผ ์ถ๊ฐํ๋ค.
1
2
3
4
5
int main(void) {
list<int> L = { 3, 7 };
L.push_front(1); // { 1, 3, 7 }
return 0;
}
โก๏ธ pop_front() - ๊ฐ์ฅ ์์ ์๋ ๊ฒ์ ์ ๊ฑฐํ๊ณ , ๊ทธ value๋ฅผ ๋ฐํํ๋ค.
1
2
3
4
5
int main(void) {
list<int> L = { 1, 5, 3, 7, 10 }
L.pop_front(); // { 5, 3, 7, 10 }
return 0;
}
โก๏ธ push_back(value) - ๊ฐ์ฅ ๋์ value์ ์ถ๊ฐํ๋ค.
1
2
3
4
5
int main(void) {
list<int> L = { 3, 7 };
L.push_back(10); // { 3, 7, 10 }
return 0;
}
โก๏ธ pop_back() - ๊ฐ์ฅ ๋์ ์๋ ๊ฒ์ ์ ๊ฑฐํ๊ณ , ๊ทธ value๋ฅผ ๋ฐํํ๋ค.
1
2
3
4
5
int main(void) {
list<int> L = { 1, 5, 3, 7, 10 }
L.pop_back(); // { 5, 3, 7, 10}
return 0;
}
โก๏ธ front() - ๊ฐ์ฅ ์์ ์๋ ๊ฒ์ value๋ฅผ ๊ฐ์ ธ์จ๋ค.
1
2
3
4
5
6
7
class CircleList{
public:
CircleList(); // ์์ฑ์
~CircleList(); // ์๋ฉธ์
const string& front() const; // ์ปค์ ๋ค์์ ์์
};
โก๏ธ back() - ๊ฐ์ฅ ๋์ ์๋ ๊ฒ์ value๋ฅผ ๊ฐ์ ธ์จ๋ค.
1
2
3
4
5
6
7
8
class CircleList{
public:
CircleList(); // ์์ฑ์
~CircleList(); // ์๋ฉธ์
const string& back() const; // ์ปค์์ ์์
};
โก๏ธ insert(index, value) - index๋ฒ์งธ ์์น์ value๋ฅผ ์ถ๊ฐํ๋ค. ์ฆ, index๋ฒ์งธ์ ์๋ก ์ถ๊ฐ๋ ๊ฒ์ด ๊ธฐ์กด์ index๋ฒ์งธ์ ์๋ ๊ฒ์ ๊ฐ๋ฆฌํจ๋ค.
1
2
list<int>::iterator iterInsertPos = list1.begin();
list1.insert(iterInsertsPos, 100); // ์ฒซ ๋ฒ์งธ ์์น์ 100 ๋ฃ๊ธฐ
โก๏ธ erase(index) - index๋ฒ์งธ์ ์๋ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ค.
1
list1.erase(list1.begin()); // list1 ์ฒซ ๋ฒ ์งธ ์์ ์ญ์
โก๏ธ value_n_from_end(n) - ๋ค์์๋ถํฐ n๋ฒ์งธ์ ์๋ ๋ ธ๋์ value๋ฅผ ๋ฐํํ๋ค.
โก๏ธ reverse() - ๋ฆฌ์คํธ๋ฅผ ๋ค์ง๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class UnitTest {
public static void main(String[] args) {
SinglyLinkedList list = new SinglyLinkedList();
list.addLast(1);
list.addLast(2);
list.addLast(3);
list.addLast(4);
System.out.println(list);
list.reverse();
System.out.println(list);
}
}
// 1 -> 2 -> 3 -> 4
// 4 -> 3 -> 2 -> 1
โก๏ธ remove_value(value) - value์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ์ฒซ ๋ฒ์งธ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๋ค.
๐ซง ์คํ
- : ๋ฐ์ดํฐ๋ฅผ ์์ ์ฌ๋ฆฐ๋ค
LIFO (Last In First Out) ์ ๋ฐ๋ผ ์๋ฃ๋ฅผ ๋ฐฐ์ดํ๋ค
๊ฐ์ฅ ์ต๊ทผ์ ์คํ์ ์ถ๊ฐํ ํญ๋ชฉ์ด ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋ ํญ๋ชฉ
๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ์คํ์ ์์ ์๊ฐ์ i ๋ฒ์งธ ํญ๋ชฉ์ ์ ๊ทผํ ์ ์์
์คํ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ์ฐ์ฐ์ ์์ ์๊ฐ์ ๊ฐ๋ฅํ๋ค
๐ซง ์คํ์ด ์ ์ฉํ ๊ฒฝ์ฐ
- : ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๋ ์ ์ฉํจ
์ฌ๊ท์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์คํ์ ๋ฃ์ด ์ฃผ๊ณ , ์ฌ๊ท ํจ์๋ฅผ ๋น ์ ธ ๋์ ํด๊ฐ ๊ฒ์(backtrack) ํ ๋๋ ์คํ์ ๋ฃ์ด ์ฃผ์๋ ์์ ๋ฐ์ดํฐ๋ฅผ ๋นผ ์ค์ผ ํ๋ค
์ผ๋ จ์ ํ์๋ฅผ ์ง๊ด์ ์ผ๋ก ๊ฐ๋ฅํ๊ฒ ํด ์ค๋ค
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ณต์ ํํ (iterative) ๋ฅผ ํตํด์ ๊ตฌํํ ์ ์๊ฒ ํจ
๐ซง ์คํ ๊ตฌํํ๊ธฐ
1
2
3
4
5
6
function Stack(arr = Array()) {
this.arr = arr;
}
let stk = new Stack();
let stk2 = new Stack(['test', 'test2']);
โก๏ธ isEmpty() : ๋น์ด์๋์ง ํ์ธ(๋ฐํ๊ฐ t/f)
1
2
3
Stack.prototype.isEmpty = function(){
return this.arr.length === 0;
}
โก๏ธ push(data) : ์คํ์ ๋ฐ์ดํฐ ์ถ๊ฐํ๊ธฐ
1
2
3
Stack.prototype.push = function (data) {
this.arr.push(data);
};
โก๏ธ pop() : ์คํ ๋งจ ์์ ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ
1
2
3
Stack.prototype.pop = function () {
return this.arr.pop();
};
โก๏ธ top() : ์คํ ๋งจ ์์ ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
1
2
3
Stack.prototype.top = function () {
return this.arr.slice(-1);
};
โก๏ธ size() : ์คํ์ ๋ฐ์ดํฐ ๊ฐ์ ์ถ๋ ฅ
1
2
3
Stack.prototype.size = function () {
return this.arr.length;
};
๐ซง ํ
- : FIFO (First In First Out) ์์
ํ์ ์ ์ฅ๋๋ ํญ๋ชฉ๋ค์ ํ์ ์ถ๊ฐ๋๋ ์์๋๋ก ์ ๊ฑฐ๋๋ค
- ๋๋น ์ฐ์ ํ์ (bfs)
- ์ฒ๋ฆฌํด์ผ ํ ๋ ธ๋์ ๋ฆฌ์คํธ๋ฅผ ์ ์ฅํ๋ ์ฉ๋๋ก ํ ์ฌ์ฉ
- ๋ ธ๋๋ฅผ ํ๋ ์ฒ๋ฆฌํ ๋๋ง๋ค ํด๋น ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ค์ ํ์ ๋ค์ ์ ์ฅ
- ๋ ธ๋๋ฅผ ์ ๊ทผํ ์์๋๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์บ์ ๊ตฌํ
๐ซง ํ ๊ตฌํํ๊ธฐ
๐ tail ํฌ์ธํฐ๊ฐ ์๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ธฐ
โก๏ธ enqueue(value) - tail์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ value๋ฅผ ์ถ๊ฐํ๋ค
1
2
3
4
5
6
7
8
9
10
11
int main()
{
int keys[] = { 1, 2, 3, 4, 5 };
Queue q;
// ์์ ํค ์ฝ์
for (int key: keys) {
q.enqueue(key);
}
return 0;
}
โก๏ธ dequeue() - value๋ฅผ ๋ฐํํ๊ณ ๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ์์(front)๋ฅผ ์ ๊ฑฐํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
int keys[] = { 1, 2, 3, 4, 5 };
Queue q;
// ์์ ํค ์ฝ์
for (int key: keys) {
q.enqueue(key);
}
cout << q.dequeue() << endl; // 1์ ์ถ๋ ฅ
cout << q.dequeue() << endl; // 2๋ฅผ ์ถ๋ ฅ
return 0;
}
โก๏ธ empty()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <stack>
#include <cstdlib>
using namespace std;
// ๋ ๊ฐ์ Stack์ ์ฌ์ฉํ์ฌ Queue ๊ตฌํ
class Queue
{
stack<int> s1, s2;
public:
// Queue์ ์์ดํ
์ถ๊ฐ
void enqueue(int data)
{
// ์ฒซ ๋ฒ์งธ Stack์ ๋ชจ๋ ์์๋ฅผ ๋ ๋ฒ์งธ Stack์ผ๋ก ์ด๋
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
// ํญ๋ชฉ์ ์ฒซ ๋ฒ์งธ Stack์ ํธ์
s1.push(data);
// ๋ชจ๋ ์์๋ฅผ ๋ ๋ฒ์งธ Stack์์ ์ฒซ ๋ฒ์งธ Stack์ผ๋ก ๋ค์ ์ด๋ํฉ๋๋ค.
while (!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
}
// Queue์์ ์์ดํ
์ ๊ฑฐ
int dequeue()
{
// ์ฒซ ๋ฒ์งธ Stack์ด ๋น์ด ์๋ ๊ฒฝ์ฐ
if (s1.empty())
{
cout << "Underflow!!";
exit(0);
}
// ์ฒซ ๋ฒ์งธ Stack์ ์ต์์ ํญ๋ชฉ์ ๋ฐํํฉ๋๋ค.
int top = s1.top();
s1.pop();
return top;
}
};
๐งก ๊ณ ์ ๊ธธ์ด ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ธฐ
- enqueue(value) - ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์ฅ ๊ณต๊ฐ์ ๋์ item์ ์ถ๊ฐํ๋ค.
- dequeue() - value๋ฅผ ๋ฐํํ๊ณ ๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ์์๋ฅผ ์ ๊ฑฐํ๋ค.
- empty()
- full()
๐ ๋น์ฉ
- a bad implementation using linked list where you enqueue at head and dequeue at tail would be O(n) because youโd need the next to last element, causing a full traversal each dequeue
- enqueue: O(1) (amortized, linked list and array [probing])
- dequeue: O(1) (linked list and array)
- empty: O(1) (linked list and array)
๐ซง ํด์ํ ์ด๋ธ (hash table)
- : ํจ์จ์ ์ธ ํ์์ ์ํ ์๋ฃ๊ตฌ์กฐ๋ก์, key๋ฅผ value ์ ๋์์ํด
์ต์ ์ ๊ฒฝ์ฐ O(n) // n์ ํค์ ๊ฐ์
์ต์ ์ ๊ฒฝ์ฐ O(1)
๐ซง ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ํด์ ์ฝ๋ ํจ์๋ก ๊ตฌํ
1) ํค์ ํด์ ์ฝ๋ ๊ณ์ฐ
- ํค์ ์๋ฃํ์ ๋ณดํต int or long
- ํค์ ๊ฐ์ ๋ฌดํ (int ๋ ์ ํ)
2) hash(key) % array_length ๋ฐฉ์์ผ๋ก ํด์ ์ฝ๋ ์ด์ฉํด ๋ฐฐ์ด์ ์ธ๋ฑ์ค ๊ตฌํจ
- ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๊ฐ์ ์ธ๋ฑ์ค ๊ฐ๋ฆฌํฌ ์ ์์
3) ๋ฐฐ์ด์ ๊ฐ ์ธ๋ฑ์ค์๋ ํค์ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ์ฐ๊ฒฐ๋ฆฌ์คํธ ์กด์ฌ
- ํค์ ๊ฐ์ ํด๋น ์ธ๋ฑ์ค์ ์ ์ฅ (๋ฐ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ด์ฉ!)
- ๐ฅ ์ถฉ๋ : ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํค๊ฐ ๊ฐ์ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฑฐ๋, ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ
โ ํค์ ์์ํ๊ธฐ ์ํด์ ์๋ฅผ ๋ฐ๋ณต!
โ ์ฃผ์ด์ง ํค๋ก๋ถํฐ ํด์ ์ฝ๋๋ฅผ ๊ณ์ฐ, ํด์ ์ฝ๋๋ฅผ ์ด์ฉํด ์ธ๋ฑ์ค ๊ณ์ฐ, ํด๋น ํค์ ์์ํ๋ ๊ฐ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ํ์
- ๊ท ํ ์ด์ง ํ์ ํธ๋ฆฌ (balanced binary search tree)
- ํ์ ์๊ฐ์ O(logN)
- ํฌ๊ธฐ๊ฐ ํฐ ๋ฐฐ์ด์ ๋ฏธ๋ฆฌ ํ ๋นํด ๋์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ ์ ๊ณต๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ
: ํค์ ์งํฉ์ ํน์ ์์๋๋ก ์ ๊ทผ ๊ฐ๋ฅ
๐ซง ํด์ํ ์ด๋ธ ๊ตฌํํ๊ธฐ
Linear probing์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด๋ก ๊ตฌํํด๋ณด๊ธฐ
1
2
3
4
5
class Node:
def __init__(self, key, value, next):
self.key = key
self.value = value
self.next = next
โก๏ธ hash(k, m) - m์ ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ
1
2
3
// map์ ํฌ๊ธฐ: map.size()
map.size // 4
map.length // undefined
โก๏ธ add(key, value) - ํค๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด, ๊ฐ์ ๊ฐฑ์ ํ๋ค.
1
2
3
4
5
6
7
8
Hashtable ht = new Hashtable();
ht.Add("irina", "Irina SP");
ht.Add("tom", "Tom Cr");
if (ht.Contains("tom"))
{
Console.WriteLine(ht["tom"]);
}
โก๏ธ exists(key)
1
2
3
4
5
6
7
8
map์ ํด๋น key์ value ์กด์ฌ ์ฌ๋ถ: has(key)
map.has(str); // true
map.has(obj); // true
map.has('none'); // falsemap์ ํฌ๊ธฐ: map.size()
map.size // 4
map.length // undefinedmap์ ํฌ๊ธฐ: map.size()
map.size // 4
map.length // undefined
โก๏ธ get(key)
- Map ๊ฐ์ฒด๋ key-value๋ก ์ด๋ฃจ์ด์ง ํด์ํ
์ด๋ธ
- set(): key-value pair๋ฅผ map์ ์ฝ์
- get(): key๊ฐ์ผ๋ก value๋ฅผ ์ฐพ์ ๋ฆฌํด
- key์ ๋ค์ด๊ฐ ์ ์๋ ์๋ฃํ์ number, string, function, object, NaN ๋ฑ์ด ๊ฐ๋ฅ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
let number = 0; let str = 'string'; let obj = { a: 1 }; let func = () => { console.log('func'); }; map.set(number, 4); //key์ number ๊ฐ๋ฅ map.set(str, 1); // key์ string ๊ฐ๋ฅ map.set(obj, 2); //key์ object ๊ฐ๋ฅ map.set(func, 3); // key์ ํจ์ ๊ฐ๋ฅ map.set(number, 0); // ๋ฎ์ด์ฐ๊ธฐ ๊ฐ๋ฅ console.log(map); // Map(4) {0 => 0, "string" => 1, {โฆ} => 2, ฦunc => 3} map.get(str); // 1 map.get(obj); // 2 map.get('none'); // undefined map.get({ a: 1 }); // undefined, obj !== { a: 1 }
โก๏ธ remove(key)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections;
public class SamplesHashtable
{
public static void Main()
{
// Creates and initializes a new Hashtable.
var myHT = new Hashtable();
myHT.Add("1a", "The");
myHT.Add("1b", "quick");
// Removes the element with the key "3b".
myHT.Remove("3b");
}
}