- vector vs queue ์๋ ๋น๊ต
| count / time(ms) | 10000 | 20000 | 30000 | 40000 |
|---|---|---|---|---|
| vector | 202.271 | 804.508 | 1807.05 | 3209.99 |
| list | 3.057 | 5.459 | 7.868 | 10.524 |
| queue | 2.356 | 4.6 | 6.837 | 9.099 |
- ๋ฐฐ์ด๊ธฐ๋ฐ์ธ vector๋ ์ฝ์ ๊ณผ ์ญ์ ์ ์ธ๋ฑ์ค ๊ตฌ์กฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด์ O(n)๋งํผ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.(์ ์์ ์ญ์ ์ ๋ชจ๋ ํ์นธ ์ฉ ์์ง์ธ๋ค)
- ํ์ง๋ง, ์์ ์ ๊ทผ์ ํจ์ฌ ๋น ๋ฅด๋ค.
- ์๋ ์ฐจ์ด๋ ์์ ํ์ ๊ฐ์ด ๊ฝค ๋ง์ด ์ฐจ์ด๋๋ค.
์ถ์ฒ : https://blog.naver.com/omg92/60148996317
- ํฐ ๋ฌธ์ ์ ํด๋ต์ ๊ทธ๋ณด๋ค ์์ ๋ฌธ์ ์ ํด๋ต์ด ํฌํจ๋์ด ์์ผ๋ฉด ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ(Optimal SubStructure๋ฅผ ๊ฐ์ง๋ค๊ณ ํ๋ค. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ ๋ฌธ์ ์ ์๋ก ๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ์ด ํผ๋ณด๋์น ์์ด์ด๋ค.
- n๋ฒ์งธ ํผ๋ณด๋์น ์๋ An = An-1 + An-2์ ๊ฐ์ด ๊ตฌํด์ง๋ฏ๋ก, ํฐ ๋ฌธ์ An์ ์์ ๋ฌธ์ An-2๊ณผ An-1์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ํธ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด์ง๋ง, ์ค๋ณตํธ์ถ๋ก ์ธํด ๋งค์ฐ ๋นํจ์จ์ ์ธ ์ฝ๋์งํ์ด ๋๋ค.
- ์ด๋ฌํ ์ด๋ ค์์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ๋ฉด ์ข์๋ฏ ํ๋ค.
- ์ฃผ์ด์ง ๋ฌธ์ ๊ฐ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
- ์ฌ๊ทํจ์๋ก ๊ตฌํํ๊ธฐ์๋ ๋นํจ์จ์ ์ด๋ค.
- ์ฆ, An์ ๊ตฌํ ๋ ๋งค๋ฒ ๊ณ์ฐํ๋ ๊ฒ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋๊ณ , ๋ง์ง๋ง An-1๊ณผ An-2 ๋ง์ ํธ์ถํด์ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ (Memoization) ์ด๋ผ๊ณ ํ๋ค.
- ์ฒซ๋ฒ์งธ ์๋ฆฌ ๊ฐ์ ์ต์๊ฐ์ผ๋ก ์ง์ ํ๋ค.
- ๋ค์ ์๋ฆฌ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉด์ ์ต์๊ฐ์ ๊ฐฑ์ ํ๋ค.
- ๊ฒฐ๊ณผ๊ฐ๊ณผ ์ฒซ๋ฒ์งธ ์๋ฆฌ์ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค.
- ๊ทธ ๋ค์ ์๋ฆฌ๊ฐ์ ์ต์๊ฐ์ผ๋ก ์ง์ ํ๊ณ 1,2,3์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
void selectionSort(int *list, const int n)
{
int i, j, indexMin, temp;
for (i = 0; i < n - 1; i++)
{
indexMin = i;
for (j = i + 1; j < n; j++)
{
if (list[j] < list[indexMin])
{
indexMin = j;
}
}
temp = list[indexMin];
list[indexMin] = list[i];
list[i] = temp;
}
}- ์๊ฐ๋ณต์ก๋๋ O(n^2)๋ก ํจ์จ์ ์ธ ์ ๋ ฌ๋ฐฉ๋ฒ์ ์๋๋ค.
- (10๊ฐ์ ์์ผ๊ฒฝ์ฐ ๋น๊ตํ๋ ํ์๋ 10+9+8+...1์ผ๋ก 10(1+10)/2 => n(n+1)/2๋ก O(n^2)์ด๋ค.
- ์ ํ์ ๋ ฌ๊ณผ ๋ฌ๋ฆฌ, ์ฒซ๋ฒ์งธ ์์์ ๋๋ฒ์งธ ์์๋ฅผ ๋น๊ตํด์ ํฐ ์๋ฅผ ๋๋ฒ์งธ ์๋ฆฌ๋ก ๊ฐฑ์ ํ๋ค.
- ๋ ์์๊น์ง ์ํํ๋ฉฐ ๊ณ์ํด์ ์ ์๋ฆฌ ์์ ๋น๊ตํ๋ฉฐ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
- ํ ๋ฐํด ๋๋ ธ์ผ๋ฉด, ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒซ ์์๋ถํฐ ์์ํด์ ๋ค์ ์์์ ๋น๊ตํ๋ฉฐ ์๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค(์ด๋ฒ์ n-1 ๊น์ง).
- ๊ณ์ ๋ฐ๋ณตํ๋ฉฐ, ๋์๋ฆฌ์๋ ์ฐจ๊ณก์ฐจ๊ณก ํฐ ์๊ฐ ์์ด๋ฏ๋ก ๋ฐ๋ณตํ ๋๋ง๋ค ์ํํ๋ ์๋ฆฌ ์๋ฅผ ํ ์๋ฆฌ์ฉ ์ค์ฌ์ค๋ค.
void bubbleSort(int* list, const int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (list[j] > list[j + 1]) {
int temp = list[j];
list[j] = list[j + 1];
list[j + 1] = temp;
}
}
}
}- ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด์ง๋ง ์ค์ ๋ก๋ ์ ํ์ ๋ ฌ๋ณด๋ค ๋ ์ค๋๊ฑธ๋ฆฐ๋ค.
- ์ ํ์ ๋ ฌ์ ์ต์๊ฐ์ ๊ตฌํด๋๊ณ ๋ง์ง๋ง์ ์์น๋ฅผ ๋ฐ๊พธ์ง๋ง, ๋ฒ๋ธ์ ๋ ฌ์ ๋งค๋ฒ ์ ์์์ ๋น๊ต ํ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฝ์ ์ ๋ ฌ์ ์ผ์ชฝ ๋ถ๋ถ์ ์ ๋ ฌ๋์ด์๋ค๊ณ ์๊ฐํ๊ณ ๋น๊ต๋ฅผ ํ๋ค.
- ์ค๋ฅธ์ชฝ ์์์ ์ผ์ชฝ ์์๋ฅผ ๋น๊ตํ๋ฉฐ ์ผ์ชฝ ์์๊ฐ ๋ ํฌ๋ฉด ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค.
- ๊ณ์ ๋น๊ต๋ฅผ ํ๋ค๊ฐ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ ์ํ๊ฐ ์ข ๋ฃ๋๊ณ (์ด๋ฏธ ์ผ์ชฝ์ ์ ๋ ฌ๋์ด์๊ธฐ์ ์กฐ๊ฑด๋ฌธ์ ์ํด ๋ฐ๋ณต์ด ์ข ๋ฃ๋๋ค) ๋ค์ ๋ค์ ์์๋ถํฐ ๋น๊ต๊ฐ ์์๋๋ค.
void insertionSort(int* list, int N) {
for (int i = 0; i < N-1 ; i++) {
int j = i; // ์ํํ๋ index j๋ฅผ i๋ก ์ด๊ธฐํํด์ค๋ค.
while (j >= 0 && list[j] > list[j + 1]) { // j >=0 : ์ฒซ๋ฒ์งธ ์์๋ถํฐ ์ ๋ ฌ๋ ์ j--๊ฐ ๋๋ฏ๋ก j์ index๊ฐ -1์ด ๋๊ณ ๋๋ฏธ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ค.
int temp = list[j];
list[j] = list[j + 1];
list[j + 1] = temp;
j--; // ์ผ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ while ์กฐ๊ฑด์ด false(์ผ์ชฝ<์ค๋ฅธ์ชฝ)์ด ๋ ๋๊น์ง ๋ฐ๋ณต
}
}- ์๊ฐ๋ณต์ก๋๋ ์ ํ, ๋ฒ๋ธ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก O(n^2)์ด์ง๋ง - (๋ฐ๋ณต๋ฌธ์ด ๋๋ฒ) ์ค์ ๋ก๋ ์ ํ์ ๋ ฌ, ๋ฒ๋ธ์ ๋ ฌ๋ณด๋ค ํจ์จ์ ์ผ ์ ์๋ค.
- ๋ฐฐ์ด์ด ๊ฑฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ด๊ธฐํ๋์ด์์ ๊ฒฝ์ฐ, ์ฝ์ ์ ๋ ฌ์ ์ํ๊ฐ ์ข ๋ฃ๋๋ ์์ ์ ์๊ธฐ์ ํจ์ ํจ์จ์ ์ผ๋ก ์ ๋ ฌ์ด ๊ฐ๋ฅํ๋ค.
- ํ์ํ ๋๋ง ์ฝ์ ์ ํ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์ ๋ ฌ๋์ด์์ ๊ฒฝ์ฐ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋น ๋ฅผ ์ ์๋ค.
- pivot์ ์ ํด์ ์ผ๋ฐ์ ์ผ๋ก pivot ๊ธฐ์ค์ผ๋ก ์์ ๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ๋ ฌ์ ํด์ค๋ค.
- ์ผ์ชฝ ์์์์๋ฅผ start, ์ค๋ฅธ์ชฝ ๋๋ ธ๋๋ฅผ end๋ก ํด์ start++ . end -- ํ๋ฉด์ pivot๋ณด๋ค ํฐ๊ฐ, ์์๊ฐ์ ๊ฐ๊ฐ ์ฐพ์์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
- ๊ณ์ํด์ ์์น๋ฅผ ๋ฐ๊พธ๋ค๊ฐ start์ end์ index๊ฐ ์๋ก ์๊ฐ๋ฆด ๊ฒฝ์ฐ, end์ ๊ฐ๊ณผ pivot์ผ๋ก ์ ํ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊ฟ์ค๋ค.
- end์ index๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์์๋ค๊ณผ ์ค๋ฅธ์ชฝ ์์๋ค์ ํํฐ์ ์ผ๋ก ๋๋ ์ ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. (์ฌ๊ท ํธ์ถ)
void quicksort(int* list, int start, int end) {
if (start >= end) {
return; //์์ ํ๊ฐ์ผ๋ ์ฌ๊ท๋ฅผ ์ข
๋ฃ.
}
int i = start+1;
int j = end;
int pivot = start;
while (i <= j) { // ์๋ก ์๊ฐ๋ฆด๋๊น์ง ๋ฐ๋ณต => ์ฐธ ์กฐ๊ฑด์ ์๊ฐ๋ฆฌ์ง ์์ ๋๊น์ง
while (list[pivot] >= list[i] && i<=end) { // ํค๊ฐ๋ณด๋ค ํฐ๊ฐ์ ์ฐพ์๋ : ์ฆ ํผ๋ด์ด ๊ณ์ ํด ๋ ์ฐธ๊ฐ์ด๊ณ ์์ผ๋ฉด ์ค๋จ => list[pivot]<=list[i]์ด ์ค๋จ์กฐ๊ฑด
i++;
} // i<=end ์กฐ๊ฑด์ end๋ฅผ ๋ฒ์ด๋๊ธฐ์ ๊น์ง. (๋ฑํธ ํฌํจ)
while (list[pivot] <= list[j] && j > start) { // ์ญ์ ํผ๋ด๊ฐ๋ณด๋ค ์์ ์์๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต = ํผ๋ด๊ฐ๋ณด๋ค ํฐ ๊ฒ์ด ์ฐธ์กฐ๊ฑด =>list[pivot] >= list[j]๊ฐ ์ค๋จ์กฐ๊ฑด
j--;
} // i>start ์กฐ๊ฑด์ start ์๊น์ง (start๋ pivot์๋ฆฌ์ด๋ฏ๋ก) (๋ฑํธ ๋ฏธํฌํจ)
if (i > j) { // ์๊ฐ๋ ธ์๋ j(end)๊ฐ๊ณผ pivot์ ๋ฐ๊ฟ์ค๋ค.
int temp = list[j];
list[j] = list[pivot];
list[pivot] = temp;
}
else { // ์๋๊ฒฝ์ฐ i์ j์ ๊ฐ์ ๋ฐ๊ฟ์ค๋ค.
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
// i์ j๊ฐ ๊ต์ฐจ๋ ๋ pivot๊ณผ j์ ๊ฐ์ ๋ฐ๊พธ๊ณ j๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ ์ ๋ ฌ๋๋ค.
quicksort(list, start, j-1); // j๊ธฐ์ค ์ผ์ชฝ ํํฐ์
quicksort(list, j+1, end); // j๊ธฐ์ค ์ค๋ฅธ์ชฝ ํํฐ์
}
- ํต์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๋ ํ๊ท ์ ์ผ๋ก O(nLogn)์ด๋ค.
- ๋ถํ ์ ๋ณต+์ฌ๊ทํธ์ถ์ผ๋ก n๋ฒ ํ์ํ๋ฉฐ ๋ฐ์ผ๋ก ์ชผ๊ฐ์ ๊น์ด(logn)๊ฐ ์ ํด์ง๋ฏ๋ก n * logn์ด๋ค.
- ์ต์ ์ O(n^2)๋ก ์ ๋ ฌ๋์ด์๋ ๋ฆฌ์คํธ๋ฅผ ํต์ ๋ ฌ ํ ๊ฒฝ์ฐ ๋งค๋ฒ n๋ฒ ํ์ * n๋ฒ ํธ์ถ๊น์ด(ํ์)๋ก n * n์ด ๋๋ค. (๋ถ๊ท ํ ๋ถํ ์ด ๋๋ค.)
- ์ผ๋ฐ์ ์ผ๋ก๋ ์์ ์ ํ, ๋ฒ๋ธ, ์ฝ์ ์ ๋ ฌ๊ณผ ๋น๊ตํด์ ์ฑ๋ฅ์ด ๋น ๋ฅด๋ค.
- while๋ฌธ ์์ while ๋๊ฐ์์ ์กฐ๊ฑด์ ๋ถ๋ฑํธ๋ฅผ ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
- list[pivot] <= list[i] ์ list[pivot] >= list[j] ์ผ๋ก ๋ถ๋ฑํธ๋ฐฉํฅ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค. (๊ทธ๋ฌ๋ฉด ์ผ์ชฝ์ ํฐ ๊ฐ, ์ค๋ฅธ์ชฝ์ ์์ ๊ฐ์ด ์ ๋ ฌ)
- ๋ณํฉ ์ ๋ ฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถํ ์ ๋ณต ๋ฐฉ์ ์ฑํํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ํต ์ ๋ ฌ์ ํผ๋ด๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋๋์ง๋ง, ๋ณํฉ ์ ๋ ฌ์ ํญ์ ๋ฐ์ผ๋ก ๋๋๋ ํน์ง(์ด๊ฒ์ด logN์ ๋ง๋ ๋ค).
- ๋ฆฌ์คํธ๋ฅผ ์์ ๋จ์๋ก ๋ชจ๋ ๋๋ ๋ค์์, ๋ณํฉํ๋ฉด์ ๋ถ๋ถ์งํฉ์ ๋ง๋ค๊ณ , ๊ทธ ์งํฉ์ ๋ ๋ณํฉํ๋ค.
- ๋ณํฉ์ ์งํํ ๋, ๋ถ๋ถ ์งํฉ์ ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด ์๋ ์ํ๋ก ๊ฐ์ ํ๋ค.
- ์ฆ, ์งํฉ์ ๋ฐ์ฉ ๋๋ ์ ์์ ๋จ์๋ก ๋๋ ๋ค์ ํฉ์น๋ ์๊ฐ์ ์ ๋ ฌ์ ์ํํ๋ฉฐ ๋์๊ฐ๋ค.
int sorted[8]; // ์ ๋ ฌ๋ ์์๋ฅผ ์ ์ฅํ ๋ฐฐ์ด์ ํญ์ ์ ์ญ๋ณ์๋ฅด ์ ์ฅํด์ฃผ์.
void merge(int* list, int start, int middle, int end) {
int i = start;
int j = middle + 1;
int k = start;
while (i<=middle && j <=end) {
// ์ฐธ์กฐ๊ฑด์ ๋ index๊ฐ ๋ชจ๋ ๋๋ฌํ์ง ์์์๋ / i๊ฐ middle๊น์ง๊ฐ๊ฑฐ๋ j๊ฐ end๊น์ง ๊ฐ๊ฑฐ๋(false ์กฐ๊ฑด)
if (list[i] <= list[j]) {
// ๋ธ๋ญ ์ธ๋ฑ์ค๋ผ๋ฆฌ ๋น๊ตํด์ sorted array์ ์์ ์๋ถํฐ ๋ฃ์ด์ค๋ค.
sorted[k] = list[i];
i++;
}
else {
sorted[k] = list[j];
j++;
}
k++; //sorted array์ ์ธ๋ฑ์ค k๋ฅผ ํ์นธ์ฉ ์ฎ๊ฒจ์ฃผ๋ฉด์ ์งํ
}
// ๋จ์ ๋ฐ์ดํฐ ์ฝ์
if (i > middle) {
//์ ๋ธ๋ญ์ด ๋จผ์ sorted array์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ ๋ท ๋ธ๋ญ์ ์ธ๋ฑ์ค j๋ฅผ end๊น์ง ์ฎ๊ฒจ์ฃผ๋ฉด์ ๋ฃ์ด์ค๋ค.
for (int t = j; t <= end; t++) {
sorted[k] = list[t];
k++;
}
}
else {
// ์ญ์ ๋ท๋ธ๋ญ์ด ๋จผ์ sorted array์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ ์ ๋ธ๋ญ์ ์ธ๋ฑ์ค i๋ฅผ middle๊น์ง ์ฎ๊ฒจ์ฃผ๋ฉด์ ๋ฃ์ด์ค๋ค.
for (int t = i; t <= middle; t++) {
sorted[k] = list[t];
k++;
}
}
for (int t = start; t <= end; t++) {
list[t] = sorted[t];
} // ์ ๋ ฌํ(sorted array) ์๋ฅผ ๋ค์ ์๋ ๋ฐ์ดํฐlist์ ๋ฃ์ด์ค๋ค.
}
void mergeSort(int* list, int start, int end) {
if (start < end) { // ํฌ๊ธฐ๊ฐ 1๋ณด๋ค ํฐ ๊ฒฝ์ฐ mergeSort๋ฅผ ์งํ.
int middle = (start + end) / 2;
mergeSort(list, start, middle);
mergeSort(list, middle + 1, end);
merge(list, start, middle, end);
} // ๊ณ์ํด์ middle์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ผ๋ก ๋๋๊ณ merge ํจ์๋ฅผ ํธ์ถํ๋ฉฐ ๋ณํฉ์ ์งํํ๋ค.
}- ๋ณํฉ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(nLogn)์ด๋ค.
- ํญ์ ๋ฐ์ผ๋ก ๋๋๊ธฐ์ nLogn์ ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด ์๋ ๋ ๋ธ๋ญ์ ํฉ์น๋ ๊ฒ์ o(N)์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐ๋ผ์ ํต์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ O(N^2)์ด์ง๋ง ๋ณํฉ ์ ๋ ฌ์ ํญ์ O(nLogn)์ ๋ณด์ฅํ๋ค.
- ํ์ง๋ง ๋ณํฉ ์ ๋ ฌ์ ๊ธฐ์กด์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ถ๊ฐ์ ์ธ ๋ฐฐ์ด ๊ณต๊ฐ์ด ํ์ํ๋ค ๋ผ๋ ์ ์์ ๋ฉ๋ชจ๋ฆฌ ํ์ฉ์ด ๋นํจ์จ์ ์ผ ์ ์๋ค.
- ํ์ด๋ ์์ ์ด์ง ํธ๋ฆฌ์ ์ผ์ข ์ผ๋ก ์ฐ์ ์์ ํ๋ฅผ ์ํ์ฌ ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ค ์ค์์ ์ต๋๋ ์ต์๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ฐพ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ํ์ ์ผ์ข ์ ๋ฐ์ ๋ ฌ ์ํ(partial order)๋ฅผ ์ ์งํ๋ค. (ํฐ ๊ฐ์ด ์์ ๋ ๋ฒจ, ์์ ๊ฐ์ด ํ์ ๋ ๋ฒจ)
- ํ ํธ๋ฆฌ์์๋ ์ค๋ณต๋ ๊ฐ์ ํ์ฉํ๋ค. (์ด์ง ํ์ ํธ๋ฆฌ์์๋ ์ค๋ณต๋ ๊ฐ์ ํ์ฉํ์ง ์๋๋ค)
- ์ต๋ ํ
- ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ
- key(๋ถ๋ชจ ๋ ธ๋) >= key(์์ ๋ ธ๋)
- ์ต์ ํ
- ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ
- key(๋ถ๋ชจ ๋ ธ๋) <= key(์์ ๋ ธ๋)
-
ํ์ ์ ์ฅํ๋ ํ์ค์ ์ธ ์๋ฃ๊ตฌ์กฐ๋ ๋ฐฐ์ด์ด๋ค.
-
๊ตฌํ์ ์ฝ๊ฒ ํ๊ธฐ ์ํ์ฌ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ 0์ ์ฌ์ฉ๋์ง ์๋๋ค.
-
์ผ์ชฝ ์์ = ๋ถ๋ชจ ๋ ธ๋ * 2 | ์ค๋ฅธ์ชฝ ์์ = ๋ถ๋ชจ ๋ ธ๋ * 2 + 1 | ๋ถ๋ชจ ๋ ธ๋ = ์์ / 2
-
STL ์ฌ์ฉ์
#include <queue>
priority_queue<์๋ฃํ, container, ์ค๋ฆ/๋ด๋ฆผ์ฐจ์> ์ด๋ฆ;
priority_queue<int, <vector<int>, greater<int>> pq;
ํ push, top, empty ๋ฑ ์ฐ์ฐ ์ํ
- ์คํ์ ํ์ชฝ ์ ๊ตฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๋ LIFO(LAST IN FIRST OUT)์ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ์ฆ, ๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋๋ค.
- C++์์๋ ์ง์ ๊ตฌํํ๊ฑฐ๋, STL #Include ์ ์ด์ฉํด์ ์ฌ์ฉํ ์ ์๋ค.
- ํ๋ ์์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋บ ์ ์๋ FIFO(FIRST IN FIRST OUT)์ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ์ฆ, ๊ฐ์ฅ ๋จผ์ ๋ฃ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋๋ค. (๋ฃ์ ์์๋๋ก ์ ๊ฑฐ๋๋ค)
- C++์์๋ ์ง์ ๊ตฌํํ๊ฑฐ๋, STL #Include ๋ฅผ ์ด์ฉํด์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ฐฐ์ด๋ก ํ๋ฅผ ๊ตฌํํ์๋, ์ ํ๋ฐฐ์ด์์๋ ๋ฐ์ดํฐ ์ฝ์ , ์ญ์ ๋ฅผ ๋ฐ๋ณตํ๋ฉด ์ด๋์๊ฐ ํ๋ ๋ฐ์ดํฐ๊ฐ ๊ฝ ์ฐผ๋ค๊ณ ์๊ฐํ๊ฒ ๋๋ค. (์ค์ ๋ก๋ ์์ ๋น์ด์์)
- ๋ฐ๋ผ์ ๋ฐฐ์ด์ ์๊ณผ ๋์ ์ด์ด์ค์ผ๋ก, ์ํ์ ์ด๋ค์ ๋ง์ง๋ง ์ธ๋ฑ์ค ์ดํ ์ ๊ทผ์ ๋ค์ ์ฒ์๋ถํฐ ์ ๊ทผํ๊ฒ๋ ๊ตฌํ์ ํด์ค๋ค. (% ์ฐ์ฐ ์ด์ฉ)
- ๊ตฌํ ์๋ฆฌ๋ front์ rear์ index = 0์ผ๋ก ํด์ฃผ๊ณ , ํญ์ enqueue/ dequeue ์ front์ rear์ ์ธ๋ฑ์ค๋ฅผ 1 ๋๋ ค์ค ํ์ ์ํ์ ํ๋ค.
- ์ํํ๊ฐ full์ธ์ง ์๋์ง ๋น๊ตํ๊ธฐ ์ํด์ ํ ์นธ์ ํญ์ ๋น์๋๊ณ , ๊ทธ๊ณณ์ front๊ฐ ํญ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค. (full์กฐ๊ฑด : (rear+1) % MAX_SIZE == front )
- enqueue์ rear = (rear+1) % MAX_SIZE ์ ํตํด rear ํ์นธ ์ด๋ & % MAX_SIZE๋ฅผ ํตํด ์ํ์ผ๋ก ๋ฐฐ์ด์ ๊ทผ์ ํ๊ฒ๋ ๊ตฌํํ๋ค.
- dequeue์ front = (front+1) % MAX_SIZE ์ ํตํด front ํ์นธ ์ด๋ & % MAX_SIZE๋ฅผ ํตํด ์ํ์ผ๋ก ๋ฐฐ์ด์ ๊ทผ์ ํ๊ฒ๋ ๊ตฌํํ๋ค.
- ๊ทธ๋ฌ๋ฉด front๋ dequeue๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ํญ์ front๋ ๋น ๊ณณ์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
- ํ์์ ํ ๋ ๋๋น๋ฅผ ์ฐ์ ์ผ๋ก ํ์ฌ ํ์์ ์ํํ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ
- "๋งน๋ชฉ์ ์ธ ํ์"์ ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ ์ ์๋ ํ์ ๊ธฐ๋ฒ์ผ๋ก "์ต๋จ ๊ฒฝ๋ก"๋ฅผ ์ฐพ์์ค๋ค๋ ์ ์์ ์ต๋จ ๊ธธ์ด๋ฅผ ๋ณด์ฅํด์ผ ํ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํ(Queue) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
- unweighted graph์ ๋ํด ์ต๋จ๊ฑฐ๋ฆฌ ๊ณ์ฐ์๋ ์ด์ฉํ๋ค.
- ์๊ฐ๋ณต์ก๋๋ O(N+M) n์ vertex, m์ edge์ ๊ฐฏ์์ด๋ค.
- BFS๋ฅผ ์งํํ๋ฉด์ queue์ ๋ชจ๋ vertex๊ฐ ํ๋ฒ์ฉ enqueue, dequeue๊ฐ ๋จ์ ๋ฐ๋ผ O(N)์ ์๊ฐ์ด ์ถ๊ฐ๋๊ณ , enqueue๋ vertex์ ์ฐ๊ฒฐ๋ neighbor๋ค์ ํ๋ฒ์ฉ ํ์ํ๋ฏ๋ก ๊ทธ๋ํ์ ๋ชจ๋ vertex์ ๋ํด ๊ฐ deg(v)์ ํฉ์ด ๋๋ค. ์ด๊ฒ์ 2xM์ด๊ณ ๊ฒฐ๊ตญ์ O(N+M)์ด ๋์ค๊ฒ ๋๋ค.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
vector<int> a[1001];
bool check[1001]; // ๋ฐฉ๋ฌธํ ๋
ธ๋์ธ์ง ํ์ธ
void bfs(int start) {
queue<int> q;
check[start] = true;
q.push(start);
while (!q.empty()) {
int node = q.front();
q.pop();
cout << node << " ";
for (int i = 0; i < a[node].size(); i++) {
int next = a[node][i];
if (check[next] == false) {
check[next] = true;
q.push(next);
}
}
}
}
int main() {
int n, m, start; // ๋
ธ๋ ๊ฐฏ์, ๊ฐ์ ๊ฐฏ์, ์์๋
ธ๋
cin >> n >> m >> start;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
a[u].push_back(v); // u์ v๋ฅผ ์
๋ ฅ๋ฐ์์ ์ฐ๊ฒฐํด์ค๋ค.
a[v].push_back(u);
}
for (int i = 1; i <= n; i++) // ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ ๋ ฌํด์ค๋ค (1๊ณผ ์ฐ๊ฒฐ๋ ๋
ธ๋๊ฐ 3, 5, 1์ด๋ผ๋ฉด 1, 3, 5๋ก)
sort(a[i].begin(), a[i].end());
bfs(start);
return 0;
}
vector์ ๋ํ ์ดํด
- a[i].push_back(k)๋ ๋ฒกํฐ์์[i]์์ ์ถ๊ฐ๋ก [0],[1],[2]์ฒ๋ผ ์ ์ฅํด์ค๋ค.
์ฆ a[node].size()ํ๋ฉด ์์ ๊ฒฝ์ฐ 3์ด๊ณ ๊ทธ ํ์๋งํผ a[node][i] (a[node]์์์ index๋ฅผ ๋๋ฆฌ๋ฉด์ vector์์ ์์ ๋ฐฐ์ด์ ์ ๊ทผํ๋ ๊ฒ์ด๋ค)
๊ฒฐ๊ณผ์ ์ผ๋ก, ๊ทธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค๋ก ํด์๋์ด์ง๋ฉฐ bfs๋ฅผ ์ํํ ์ ์๋ค.
- ์์ ๋ ธ๋๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- ์์ ๋ ธ๋์ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ true๋ก ๋ฐ๊พผ ํ, ์ฃผ๋ณ ๋ ธ๋ ๊ฒ์์ ์ํด ์ ์ฅ ํ queue์์ ๋นผ์ค๋ค.
- ๋ฐ๋ณต๋ฌธ์ ํตํด ์์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ๋ฐฉ๋ฌธํ๋ค. (a[node].size()๋ ๊ทธ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ๊ฐฏ์๋งํผ)
- ๊ฐ๊ฐ ๋ฐฉ๋ฌธํ ๋ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ฒดํฌ ํ ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ค๋ฉด ๋ค์, ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด queue์ ๋ฃ์ด์ฃผ๊ณ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ true๋ก ๋ฐ๊พผ๋ค.
- queue๊ฐ empty()๊น์ง ๊ณ์ ๋ฐ๋ณตํด์ค๋ค.
์ถ์ฒ : https://twpower.github.io/73-how-to-implement-dfs-and-bfs-in-cpp
- ํ์์ ํจ์ ์์ด ๋ณด๋ค ๊น์ ๊ฒ์ ์ฐ์ ์ ์ผ๋ก ํ๋ ํ์ ์๊ณ ๋ฆฌ์ฆ.
- ์ผ๋ฐ์ ์ผ๋ก ์คํ(Stack) ์๊ณ ๋ฆฌ์ฆ ๋๋ ์ฌ๊ทํจ์(Recursion)์ ์ฌ์ฉํ๋ค.
- ์๊ฐ๋ณต์ก๋๋ DFS๋ ์ญ์ O(N+M) n์ vertex, m์ edge์ ๊ฐฏ์์ด๋ค.
- DFS๋ฅผ ์งํํ๋ฉด์ ๋ชจ๋ vertex๊ฐ ํ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ฒ ๋๊ณ O(N)์ ์๊ฐ์ด ์ถ๊ฐ๋๊ณ , vertex์ ์ฐ๊ฒฐ๋ neighbor๋ค์ ํ๋ฒ์ฉ ํ์ํ๋ฏ๋ก ๊ทธ๋ํ์ ๋ชจ๋ vertex์ ๋ํด ๊ฐ deg(v)์ ํฉ์ด ๋๋ค. ์ด๊ฒ์ 2xM์ด๊ณ ๊ฒฐ๊ตญ์ O(N+M)์ด ๋์ค๊ฒ ๋๋ค.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> a[1001];
bool checked[1001];
int u, v;
void dfs(int node) {
checked[node] = true;
cout << node << " ";
for (int i = 0; i < a[node].size(); i++) {
int next = a[node][i];
if (checked[next] == false)
dfs(next);
}
}
int main() {
int n, m, start;
cin >> n >> m >> start;
for (int i = 0; i <m; i++) {
cin >> u >> v;
a[u].push_back(v);
a[v].push_back(u);
}
for (int i = 1; i <= n; i++)
sort(a[i].begin(), a[i].end());
dfs(start);
return 0;
}- ๋ ธ๋๋ฅผ ์ ๋ ฅ๋ฐ์ ํ, ์์๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ์๋ฃ ํ ์ถ๋ ฅํด์ค๋ค.
- ์ญ์ a[node].size()๋งํผ ์ธ์ ๋ ธ๋๋ฅผ ํ์ํ๋, ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด(false)์ด๋ฉด ์ฌ๊ทํธ์ถํ๋ค.
- ๊ทธ๋ ๊ฒ ๊น์ด์ฐ์ ์ผ๋ก ํ์ํ๋ค๊ฐ, ์ด๋ ํ์ ์ ์ฐ๊ฒฐ๋ ์ธ์ ๋ ธ๋๋ค์ด ๋ชจ๋ ๋ฐฉ๋ฌธ์๋ฃ์ธ ์ํ์ด๋ฉด ์ฌ๊ทํธ์ถ๋ ํจ์๊ฐ ํ๋์ฉ ์ข ๋ฃ๋๋ฉฐ ์ ๋ ธ๋๋ก ๋น ์ ธ๋์จ๋ค.
- ์ด๋ฐ ์์ผ๋ก ํ ๋ ธ๋์ ๋ํ ๊น์ด์ฐ์ ์ผ๋ก ํ์ํ๊ณ ๋น ์ ธ ๋์จ๋ค์ ๋ค์ ๋ ธ๋์ ๊น์ด์ฐ์ ์ผ๋ก ํ์์ ๋ฐ๋ณตํ๋ค.
์ถ์ฒ : https://twpower.github.io/73-how-to-implement-dfs-and-bfs-in-cpp
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฑํธ๋ํน์ '๊ฐ๋ฅํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ํ์ํ๋ค'๋ผ๋ ์์ด๋์ด๋ฅผ ๊ฐ๊ณ ์๋ค.
- ๋ํ์ ์ธ ์์ ํ์ ๋ฐฉ๋ฒ์ผ๋ก๋ DFS๊ฐ ์๋๋ฐ DFS๋ ํ์ฌ ์ง์ ์์ ๋ฐฉ๋ฌธํ ๊ณณ์ด ์์ผ๋ฉด ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด์ ๊ณ์ ํ์์ ์งํํ๋ค.
- DFS์ ์ฅ์ ์ ๋ฌดํํ ๊น์ ๊ณณ์ ์ฐพ์์ผ ํ ๋ ํจ๊ณผ์ ์ธ๋ฐ, ๋ชจ๋ ๊ณณ์ ๋ฐฉ๋ฌธํ๊ธฐ์ ํ์ ์๋ ๊ฒฝ๋ก๊น์ง ํ์ํ๋ฏ๋ก ๋นํจ์จ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋ค.
- ๊ทธ๋์ ํ์ ์๋ ๊ฒฝ๋ก๋ ์ฐจ๋จํ๊ณ ๋ชฉํ์ง์ ์ ๊ฐ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฃจํธ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ๋ฐฑํธ๋ํน์ด๋ค.

