https://thewayaboutme.tistory.com/91
์ด ๊ธ์ ์ ๋ธ๋ก๊ทธ ๊ธ์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋์์ต๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์
์ฌ๋ฌ๊ฐ์ง ๊ฐ๋ค์ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ์ ์๋ง ๋ฐฐ์ด(Array)์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์ค๊ฐ์ ์๋ ์์๋ฅผ ์ญ์ ํ๊ฑฐ๋, ๊ฐ์ ์ฝ์ ํ ๋ ๊ต์ฅํ ๋นํจ์จ์ ์ด๋ค.
๋ง์ฝ ์๋์ ๊ฐ์ ๋ฐฐ์ด์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ฌ๊ธฐ์ 22๋ฅผ ์ญ์ ํ๋ ค ํ๋ค๊ณ ํ๋ฉด 22๋ฅผ ์ง์ด ๋ค
๋ค์ ์๋ ์์๋ค์ ๋ชจ๋ ์์ผ๋ก ํ์นธ์ฉ ์ฎ๊ฒจ์ค์ผ ํ๋ค.
์ฆ ์์๊ฐ n๊ฐ๋ผ๋ฉด ์์์ ์ํํ ์์ ์ ์๊ฐ๋ณต์ก๋๋ O(n)์ด ๋๋ค. (์ฝ์ ์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง)
์ด๋ฌํ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ด๋ค. ์ด ๊ธ์์๋ ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ํด ๋ค๋ฃฐ ๊ฒ์ด๋ค.
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Singly Linked List)๋?
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ชจ๋ ์์(element)๊ฐ ๋ฐ์ดํฐ, ๋งํฌ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ด ๋งํฌ(์๋ฅผ๋ค์ด ํฌ์ธํฐ)๋ฅผ ํตํด ๋ค ์์์ ์ฐ๊ฒฐ๋๋ ๊ตฌ์กฐ์ด๋ค. ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์ ๊ฐ ์์๋ '๋ ธ๋'๋ผ๊ณ ํํํ๋ค. ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
์์์ ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋งํฌ(ํฌ์ธํฐ)๋ฅผ ํตํด ๋ค ์์์ ์ฐ๊ฒฐ๋๋ ๊ตฌ์กฐ๋ผ๊ณ ํ์๋ค. ์ฆ ๋ ธ๋๋ค์ด ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํน๋ณํ ์ฒซ๋ฒ์งธ ๋ ธ๋๋ 'head', ๋ง์ง๋ง ๋ ธ๋๋ 'tail'์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ๋ ธ๋(tail)์ NULL๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. ๋ฐ๋ผ์ ๋จ์ผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌํ(C++)
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ C++๋ก ์ผ๋ฐ์ ์ผ๋ก ์๋์ ๊ฐ์ด ๊ตฌํํ๋ค.
class StringNode {
private:
string elem; //์์์ ๊ฐ
StringNode* next; //๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
friend class StringLinkedList; //StringLinkedList์ private์์ ์ ๊ทผ๊ฐ๋ฅ
};
StringLinkedList๋ ์๋์ ๊ฐ๋ค.
class StringLinkedList {
public:
StringLinkedList(); //๋น ๋ฆฌ์คํธ ์์ฑ
~StringLinkedList();
bool empty()const; //๋ฆฌ์คํธ๊ฐ ๋น์๋์ง ํ์ธํ๋ ํจ์
const string& front()const; //์ฒซ๋ฒ์งธ ์์ return
void addFront(const string& e); //๋งจ ์์ ์์ ์ถ๊ฐ
void removeFront(); //๋งจ ์ ์์ ์ ๊ฑฐ
private:
StringNode* head;
};
์ด์ StringLinkedList์ ๊ฐ ํจ์๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ตฌํํด ๋ณด์.
๋จผ์ ์์ฑ์์ ์๋ฉธ์์ด๋ค. ๊ฐ๊ฐ ์๋์ ๊ฐ์ด ๊ตฌํํ๋ค.
StringLinkedList::StringLinkedList()
:head(NULL){} //์ฆ head==NULL์ด๋ฉด ๋น ๋ฆฌ์คํธ๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
StringLinkedList::~StringLinkedList() { while (!empty())removeFront(); }
//emptyํจ์๊ฐ true๋ฅผ ๋ฆฌํดํ ๋ ๊น์ง removeFrontํจ์๋ฅผ ์คํํ๋ค.
์ด์ ์์์ ์ฌ์ฉํ empty ํจ์๋ฅผ ๊ตฌํํด ๋ณด์. head==NULL์ด๋ฉด ๋น ๋ฆฌ์คํธ๋ผ๋ ์ ์ ์ด์ฉํ๋ค.
bool StringLinkedList::empty()const {
return head == NULL;
}
์ฒซ๋ฒ์งธ ์์๋ฅผ ๋ฆฌํดํ๋ frontํจ์๋ ์๋์ ๊ฐ์ด ๊ตฌํํ๋ค.
const string& StringLinkedList::front()const { return head->elem; }
์ฌ๊ธฐ์ .์ด ์๋ ->๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๋ head ๊ฐ ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. (StringNode* head;)
. : ์์ ํฌ์ธํฐ๊ฐ ์๋ ๊ฒ(๋ณ์์ ๊ฐ์)์ด ์์ ๋ ์ฌ์ฉ
-> : ์์ ํฌ์ธํฐ๊ฐ ์์ ๋ ์ฌ์ฉ
addFrontํจ์์ ๊ตฌํ
์ด์ addFrontํจ์๋ฅผ ๊ตฌํํด ๋ณด๋๋ก ํ์. ๋งจ ์์ ์์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด์๋ ์๋ ์ธ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.
- ์๋ก์ด ๋ ธ๋ ์์ฑ(๋์ ํ ๋น)
- ์๋ก์ด ๋ ธ๋์ next(ํฌ์ธํฐ)๊ฐ ํ์ฌ head๊ฐ์ ๊ฐ๋ฆฌํค๋๋ก ํจ
- head๋ณ์๊ฐ ์๋ก ์์ฑํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ๋์ฑ ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๋ค.
1. ์๋ก์ด ๋ ธ๋ ์์ฑ
2. ์๋ก์ด ๋ ธ๋์ next(ํฌ์ธํฐ)๊ฐ ํ์ฌ head๊ฐ(ํ๋์ ์ฒซ๋ฒ์งธ ๋ ธ๋)์ ๊ฐ๋ฆฌํค๋๋ก ํจ
3. head๋ณ์๊ฐ ์๋ก ์์ฑํ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ
์ด์ ์์์ ํ ์ธ๊ฐ์ง ๋จ๊ณ๋ฅผ ์ฝ๋๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
void StringLinkedList::addFront(const string& e) { //e๋ ์๋ก ๋ฃ์ ๊ฐ(๋ฃ๊ณ ์ ํ๋ ๊ฐ)
StringNode* v = new StringNode; //1. ๋์ ํ ๋น์ผ๋ก ์๋ก์ด ๋
ธ๋ ์์ฑ
v->elem = e; //์๋ก์ด ๋
ธ๋์ ๊ฐ ๋ฃ๊ธฐ
v->next = head; //2. ์๋ก ๋ง๋ ๋
ธ๋๊ฐ head๊ฐ์ ๊ฐ๋ฆฌํค๋๋ก ํจ
head = v; //3. head๊ฐ ์๋ก ๋ง๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ
}
removeFrontํจ์์ ๊ตฌํ
์ด์ ๋งจ ์ ์์๋ฅผ ์ญ์ ํ๋ removeFrontํจ์๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ์. ์ญ์ ์ ๊ฒฝ์ฐ ๋์ฑ ๊ฐ๋จํ๋ค. ๋ง์ฝ ์์์ ์ถ๊ฐํ ์ฃผํฉ์ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๋ค๊ณ ๊ฐ์ ํ์.
๋งจ ์ ์์๋ฅผ ์ญ์ ํ๊ธฐ ์ํด์๋ ์ธ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.
- head์ ๊ฐ์ ์์ ๋ณ์(์ผ๋ฐ์ ์ผ๋ก old์ฌ์ฉ)์ ์ ์ฅ
- head์ ๊ฐ์ old์ ๋ค์ ๋ ธ๋๋ก ๋ณ๊ฒฝ(head๊ฐ ๋๋ฒ์งธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ)
- old ์ญ์
์ด ๊ณผ์ ์ญ์ ๊ทธ๋ฆผ์ ์ดํด๋ณด๋๋ก ํ์.
1. head์ ๊ฐ์ ์์๋ณ์ old์ ์ ์ฅ(์ฒซ๋ฒ์งธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ old๋ณ์ ์์ฑ)
2. head์ ๊ฐ์ old์ ๋ค์ ๋ ธ๋๋ก ๋ณ๊ฒฝ(head๊ฐ ๋๋ฒ์งธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ)
3. old์ญ์
์ ๊ณผ์ ์ ์ฝ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
void StringLinkedList::removeFront() {
StringNode* old = head; //1. head์ ๊ฐ์ ์์๋ณ์ old์ ์ ์ฅ(์ฒซ๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ old๋ณ์ ์์ฑ)
head = old->next; //2. head์ ๊ฐ์ old์ ๋ค์ ๋
ธ๋๋ก ๋ณ๊ฒฝ(head๊ฐ ๋๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ)
delete old; //3. old์ญ์
}
์ด์ ๋ฆฌ
์์์ ์์ฑํ ์ฝ๋๋ค์ ๋ชจ๋ ๋ชจ์ผ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค.
#include <iostream>
#include <string>
using namespace std;
class StringNode {
private:
string elem; //์์์ ๊ฐ
StringNode* next; //๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
friend class StringLinkedList; //StringLinkedList์ private์์ ์ ๊ทผ๊ฐ๋ฅ
};
class StringLinkedList {
public:
StringLinkedList(); //๋น ๋ฆฌ์คํธ ์์ฑ
~StringLinkedList();
bool empty()const; //๋ฆฌ์คํธ๊ฐ ๋น์๋์ง ํ์ธํ๋ ํจ์
const string& front()const; //์ฒซ๋ฒ์งธ ์์ return
void addFront(const string& e); //๋งจ ์์ ์์ ์ถ๊ฐ
void removeFront(); //๋งจ ์ ์์ ์ ๊ฑฐ
private:
StringNode* head;
};
StringLinkedList::StringLinkedList()
:head(NULL) {} //์ฆ head==NULL์ด๋ฉด ๋น ๋ฆฌ์คํธ๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
StringLinkedList::~StringLinkedList() { while (!empty())removeFront(); }
//emptyํจ์๊ฐ true๋ฅผ ๋ฆฌํดํ ๋ ๊น์ง removeFrontํจ์๋ฅผ ์คํํ๋ค.
bool StringLinkedList::empty()const {
return head == NULL;
}
const string& StringLinkedList::front()const { return head->elem; }
void StringLinkedList::addFront(const string& e) { //e๋ ์๋ก ๋ฃ์ ๊ฐ(๋ฃ๊ณ ์ ํ๋ ๊ฐ)
StringNode* v = new StringNode; //1. ๋์ ํ ๋น์ผ๋ก ์๋ก์ด ๋
ธ๋ ์์ฑ
v->elem = e; //์๋ก์ด ๋
ธ๋์ ๊ฐ ๋ฃ๊ธฐ
v->next = head; //2. ์๋ก ๋ง๋ ๋
ธ๋๊ฐ head๊ฐ์ ๊ฐ๋ฆฌํค๋๋ก ํจ
head = v; //3. head๊ฐ ์๋ก ๋ง๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ
}
void StringLinkedList::removeFront() {
StringNode* old = head; //1. head์ ๊ฐ์ ์์๋ณ์ old์ ์ ์ฅ(์ฒซ๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ old๋ณ์ ์์ฑ)
head = old->next; //2. head์ ๊ฐ์ old์ ๋ค์ ๋
ธ๋๋ก ๋ณ๊ฒฝ(head๊ฐ ๋๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ)
delete old; //3. old์ญ์
}
์์์ ๋ฐฐ์ด์ ์์์ ์ถ๊ฐ, ์ญ์ ๊ฐ ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ ๋ฐ๊ฐ ์๋ค. ์ฐ๊ฒฐ๋ฆฌ์คํธ์์๋ ์์๋ฅผ ์ถ๊ฐ, ์ญ์ ํ๋ ์์ ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(1)์ด๋ค. ํ์ง๋ง ํน์ ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(n)์ด๋ค.(์์์๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๊ทผํด์ผ ํ๋๊น) ๋ฐ๋ผ์ ํน์ ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ด์ ์ด์ฉํ๊ณ , ์์์ ์ถ๊ฐ, ์ญ์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
'์ฝ๋ฉํ ์คํธ > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++์๋ฃ๊ตฌ์กฐ] ๋ฐฐ์ด(Array)๊ตฌํ (2) | 2021.04.10 |
---|
๋๊ธ