์ด์ฝํ ์ฑ
์ ๋ ฌ(Sorting): ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์์๋๋ก ๋์ดํ๋ ๊ฒ
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ฉด ์ด์ง ํ์(Binary Search)์ด ๊ฐ๋ฅํด์ง๋ค.
- ๋ ์ธ์ ํ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด์, ์์ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ ์๋ ๋ฐ์ดํฐ๋ณด๋ค ํฌ๋ฉด, ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
//๋ฐ์ดํฐ๊ธธ์ด - 1๋งํผ ๋ฐ๋ณต์ ํจ
for index in range(๋ฐ์ดํฐ๊ธธ์ด - 1):
//์กฐ๊ฑด์ ๋ช๋ฒ์ฒ๋ฆฌํ๋
swapFlag = false;
for index2 in range(๋ฐ์ดํฐ๊ธธ์ด - index - 1):// "๋ฐ์ดํฐ๊ธธ์ด - index -1"์ ํด์ํ์๊ฐ ๋์ด๋ ๋๋ง๋ค 1์ฉ ์ค์ด๋ค๊ฒ ์ฒดํฌํจ
if ์๋ฐ์ดํฐ > ๋ค๋ฐ์ดํฐ:
swap(์๋ฐ์ดํฐ, ๋ค๋ฐ์ดํฐ)
swapFlag = true;
if swap == false:
break;
return data- ๋ฐ๋ณต๋ฌธ์ด 2๊ฐ๋๊น O(n^2)
- ์์ ์ ๋ ฌ์ด ๋์ด์๋ ์ํ๋ผ๋ฉด(์ด๋ฏธ ์ ๋ ฌ๋์ํ) O(n)
- "๊ฐ์ฅ ์์ ๊ฒ์ ์ ํ"
- ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ์๋ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๊ณ , ๊ทธ๋ค์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ์์์ ๋๋ฒ์งธ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋ฐ๋ณตํด์ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ ํ ์ ๋ ฌ์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์์ผ๋ก ๋ณด๋ด๋ ๊ณผ์ ์ N - 1๋ฒ ๋ฐ๋ณตํ๋ฉด ์ ๋ ฌ์ด ์๋ฃ๋๋ ๊ฒ์ ์ ์ ์๋ค.
- ์๊ฐ ๋ณต์ก๋
O(N^2)- ์ ํ ์ ๋ ฌ์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ์ ๋ ฌ ์๋๊ฐ ๊ธ๊ฒฉํ ๋๋ ค์ง๋ค.
for stand (๋ฐ์ดํฐ) {
์ต์๊ฐ์ธ๋ฑ์ค = ๊ธฐ์ค๊ฐ์ธ๋ฑ์ค
for index (stand ๋ค์๋ฐ์ดํฐ) {
if ( ๋ฐ์ดํฐ[์ต์๊ฐ์ธ๋ฑ์ค] > ๋ฐ์ดํฐ[ํ์ฌ์ธ๋ฑ์ค] ) {
์ต์๊ฐ์ธ๋ฑ์ค = ํ์ฌ์ธ๋ฑ์ค
}
}
swap(์ต์๊ฐ์ธ๋ฑ์ค, ๊ธฐ์ค๊ฐ์ธ๋ฑ์ค)
}var array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8];
for (var i = 0; i < array.length; i++) {
var min_index = i;
for (var j = i + 1; j < array.length; j++) {
if (array[min_index] > array[j]) {
min_index = j;
}
}
[array[i], array[min_index]] = [array[min_index], array[i]];
}
console.log(array);
- "๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ, ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ "
- ๋ฐ์ดํฐ์ ์ผ์ชฝ์ ์๋ ๋ฐ์ดํฐ๋ค์ ์ด๋ฏธ ์ ๋ ฌ์ด ๋ ์ํ์ด๋ฏ๋ก ์๊ธฐ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ฌ๋ค๋ฉด ๋์ด์ ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ณผ ํ์์์ด ๊ทธ์๋ฆฌ์ ์ฝ์ ๋๋ฉด ๋๋ ๊ฒ์ด๋ค.
- ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋น ๋ฅด๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ฌด์์์ด๋ฉด ๋งค์ฐ ๋๋ฆผ (ํต์ ๋ ฌ๊ณผ ๋ฐ๋)
- ์ฝ์ ์ ๋ ฌ์ ํ์ํ ๋๋ง ์์น๋ฅผ ๋ฐ๊พธ๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์์ ๋ ํจ์จ์ ์ด๋ค.
- ์ ํ ์ ๋ ฌ์ ํ์ฌ ๋ฐ์ดํฐ์ ์ํ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ๋ชจ๋ ์์๋ฅผ ๋น๊ตํ๊ณ ์์น๋ฅผ ๋ฐ๊พธ๋ ๋ฐ๋ฉด, ์ฝ์ ์ ๋ ฌ์ ๊ทธ๋ ์ง ์๋ค.
- ์ฝ์ ์ ๋ ฌ์ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ '์ฝ์ 'ํ๋ค๋ ์๋ฏธ์์ ์ฝ์ ์ ๋ ฌ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ๋ฐ์ดํฐ๊ฐ ์ ์ ํ ์์น์ ๋ค์ด๊ฐ๊ธฐ ์ด์ ์, ๊ทธ ์๊น์ง์ ๋ฐ์ดํฐ๋ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค.
- ์ ๋ ฌ๋์ด ์๋ ๋ฐ์ดํฐ ๋ฆฌ์คํธ์์ ์ ์ ํ ์์น๋ฅผ ์ฐพ์ ๋ค์, ๊ทธ ์์น์ ์ฝ์ ๋๋ค
- ์๊ฐ ๋ณต์ก๋
O(N^2)- ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์๋ ์ํ๋ผ๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ๋ค. ๋ณดํต์ ์ฝ์
์ ๋ ฌ์ด ๋นํจ์จ์ ์ด๋,
์ ๋ ฌ์ด ๋์ด์๋ ์ํฉ์์๋ ํต ์ ๋ ฌ ๋ฑ ๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ ๊ฒ๋ณด๋ค ์ฝ์ ์ ๋ ฌ์ ์ด์ฉํ๋ ๊ฒ์ด ์ ๋ต ํ๋ฅ ์ ๋์ผ ์ ์๋ค.
var array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8];
for (var i = 1; i < array.length; i++) {
for (var j = i; j > 0; j--) {
if (array[j] < array[j - 1]) {
[array[j], array[j - 1]] = [array[j - 1], array[j]];
} else {
break;
}
}
}
console.log(array);
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ, '๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ'
- "๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ์"
- ๋ฐ์ดํฐ๊ฐ ๋ฌด์์์ด๋ฉด ํต ์ ๋ ฌ์ด ๋งค์ฐ ๋น ๋ฅด๊ณ , ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋ ๊ฒฝ์ฐ๋ ๋งค์ฐ ๋๋ฆผ(์ฝ์ ์ ๋ ฌ๊ณผ ๋ฐ๋)
-
ํต ์ ๋ ฌ์ ๊ธฐ์ค์ ์ค์ ํ ๋ค์ ํฐ ์์ ์์ ์๋ฅผ ๊ตํํ ํ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
-
ํผ๋ฒ(pivot)์ด ์ฌ์ฉ๋จ. ํฐ์ซ์์ ์์์ซ์๋ฅผ ๊ตํํ ๋ ๊ตํํ๋ ๊ธฐ์ค์ ํผ๋ฒ์ด๋ผ๊ณ ํจ
-
ํธ์ด ๋ถํ ๋ฐฉ์ (ํผ๋ฒ์ ์ค์ ํ๊ณ ๋ฆฌ์คํธ๋ฅผ ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์์ผ๋ก ํต์ ๋ ฌ์ ๊ตฌ๋ถํ๋๋ฐ, ๊ฐ์ฅ ๋ํ์ ์ธ ๋ถํ ๋ฐฉ์์ธ ํธ์ด๋ถํ ๋ฐฉ์ ๊ธฐ์ค)
- ๋ฆฌ์คํธ์์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ์ผ๋ก ์ ํ๋ค.
- ์ผ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
- ๊ทธ๋ค์ ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์๋ก ๊ตํํด์ค๋ค.
- ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด 'ํผ๋ฒ'์ ๋ํ์ฌ ์ ๋ ฌ์ด ์ํ๋๋ค.
-
์๊ฐ ๋ณต์ก๋
O(NlogN)
-
ํผ๋ฒ์ ์ค์ ํ์ฌ ์ ๋ ฌ์ ์ํํ ํ์, ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์์ ๊ฐ๊ฐ ๋ค์ ์ ๋ ฌ์ ์ํํ๋ค.
-
์ฌ๊ทํจ์ํํ๋ก ์ฝ๋๊ตฌํ- ์ข ๋ฃ ์กฐ๊ฑด? ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ๋ค. ๋ฆฌ์คํธ์ ์์๊ฐ 1๊ฐ๋ผ๋ฉด ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด ์๋ค๊ณ ๊ฐ์ฃผํ ์ ์์ผ๋ฉฐ ๋ถํ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
let array = [5,7,9,0,3,1,6,2,4,8];
function quickSort(array, start, end) {
if (start >= end) {
return;
}
let pivot = start;//0
let left = start + 1; //1
let right = end; //9
while (left <= right) {// 1 <= 9 // 2 , 8 // 2, 7
while (left <= end && array[left] <= array[pivot]) {
// array[1] <= array[0]
left++;
}
while (right > start && array[right] >= array[pivot]) {// 6, 5
// 9 > 0 && array[9] >= array[0]
right--;
}
if (left > right) {// 1 > 8
[array[right], array[pivot]] = [array[pivot], array[right]];
} else {
[array[left], array[right]] = [array[right], array[left]];
}
}
quickSort(array, start, right - 1);
quickSort(array, right + 1, end);
}
quickSort(array, 0, array.length - 1);
console.log(array);ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋งค์ฐ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ํํ๋ก ํํํ ์ ์์๋๋ง ์ฌ์ฉํ ์ ์๋ค
- ๊ฐ์ฅ ํฐ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ์ ์ฐจ์ด๊ฐ 1,000,000์ ๋์ง ์์ ๋ ํจ๊ณผ์
- ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ํ์ ๋์ด ์๊ณ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ๋ง์ด ์ค๋ณต๋์ด ์์์๋ก ์ ๋ฆฌํ๋ฉฐ ํญ์ ์ฌ์ฉํ ์๋ ์๋ค.
- ์ผ๋ฐ์ ์ธ ์ฝ๋ฉ ํ ์คํธ์ ์์คํ ํ๊ฒฝ์์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์ ์ฝ๊ณผ ์ ์ถ๋ ฅ ์๊ฐ๋ฌธ์ ๋ก ์ธํ์ฌ
์ ๋ ฅ๋๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ 1,000๋ง๊ฐ ์ด์์ผ๋ก ์ค์ ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ๋ฌธ์ ์์์ ๋ฐ์ดํฐ ๊ฐ์๋ 1,000๋ง๊ฐ ๋ฏธ๋ง์ผ๋ก ์ถ์ ๋ ๊ฒ์ด๋ค.
-
๋จผ์ ๊ฐ์ฅ ํฐ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ์ ๋ฒ์๊ฐ ๋ชจ๋ ๋ด๊ธธ ์ ์๋๋ก ํ๋์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๊ณ (๊ฐ์ฅํฐ๋ฐ์ดํฐ+1)
๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ๋์ผํ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ฉด ๊ณ์์ ๋ ฌ์ด ์๋ฃ๋๋ค.
์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ ํ๋์ฉ ๊ทธ๊ฐ๋งํผ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค. (0์ด 2๊ฐ๋ฉด 0์ 2๋ฒ ์ถ๋ ฅ 00) -
์๊ฐ ๋ณต์ก๋
O(N+K): ๋ฐ์ดํฐ๊ฐ์๋ฅผ N, ์ต๋๊ฐ์ํฌ๊ธฐ๋ฅผ K
-
๊ณต๊ฐ ๋ณต์ก๋
O(N+K)- ๊ณ์ ์ ๋ ฌ์ ๋์ ๋ฐ๋ผ์ ์ฌ๊ฐํ ๋นํจ์จ์ฑ์ ์ด๋ํ๋ค.
- ๋์ผํ ๊ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๋ ์ ํฉํ ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ, ๋ฐ์ดํฐ ํน์ฑ์ ํ์ ํ๊ธฐ ์ด๋ ค์ฐ๋ฉด ํต์ ๋ ฌ์ ์ฌ์ฉํ์
- e.g. ์ฑ์ (100์ ์ด ์ฌ๋ฌ๋ช ์ด๋ผ๋ฉด)
-
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ๊ธฐ์ ์ ๋ ฌ(Radix Sort)๊ณผ ๋๋ถ์ด ๊ฐ์ฅ ๋น ๋ฅด๋ค๊ณ ๋ณผ ์ ์๋ค.
-
๊ธฐ์ ์ ๋ ฌ์ ๊ณ์ ์ ๋ ฌ์ ๋นํด ๋์์ ๋๋ฆฌ์ง๋ง, ์ฒ๋ฆฌํ ์ ์๋ ์ ์์ ํฌ๊ธฐ๋ ๋ ํฌ๋ค.
let array = [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2];
let count = Array(Math.max(...array) + 1).fill(0);
for (let i = 0; i < array.length; i++) {
count[array[i]]++;
}
let result = [];
for (let i = 0; i < count.length; i++) {
// i๊ฐ ์ผ๋ง๋ ์์ฃผ ๋ฑ์ฅํ๋์ง๋ฅผ ๋ํ๋ด๋ count[i]๋ฅผ ์ฌ์ฉํด ํด๋น ์ซ์๋งํผ ๋ฐ๋ณต
for (let j = 0; j < count[i]; j++) {
result.push(i);// ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ์
๋ ฅ ๋ฐฐ์ด์ ์์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ฒ๋จ
}
}
console.log(result.join(' '));๋ณํฉ ์ ๋ ฌ์ ์ผ๋ฐ์ ์ผ๋ก ํต ์ ๋ ฌ๋ณด๋ค ๋๋ฆฌ์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ์๋ ์๊ฐ๋ณต์ก๋ O(NlogN)์ ๋ณด์ฅํ๋ค.
๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ ๊ณตํ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์ ๋ ฌ ํจ์๋ ๋ณํฉ ์ ๋ ฌ ํน์ ํต ์ ๋ ฌ์ ๊ธฐ๋ฐํ๋ค. ํต ์ ๋ ฌ์ ๊ธฐ๋ฐํ๋ ๊ฒฝ์ฐ์๋ O(NlogN)์ ๋ณด์ฅํ๋๋ก ๊ตฌํ๋์ด ์๋ค.
- ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ ์ ์๋ ๋ฌธ์
- ๋จ์ํ ์ ๋ ฌ ๊ธฐ๋ฒ์ ์๊ณ ์๋์ง ๋ฌผ์ด๋ณด๋ ๋ฌธ์ ๋ก ๊ธฐ๋ณธ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์งํ๊ณ ์์ผ๋ฉด ์ด๋ ต์ง ์๊ฒ ํ ์ ์๋ค.
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ์ ๋ํด์ ๋ฌผ์ด๋ณด๋ ๋ฌธ์
- ์ ํ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ํต ์ ๋ ฌ ๋ฑ์ ์๋ฆฌ๋ฅผ ์๊ณ ์์ด์ผ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
- ๋ ๋น ๋ฅธ ์ ๋ ฌ์ด ํ์ํ ๋ฌธ์
- ํต ์ ๋ ฌ ๊ธฐ๋ฐ์ ์ ๋ ฌ ๊ธฐ๋ฒ์ผ๋ก๋ ํ ์ ์์ผ๋ฉฐ ๊ณ์ ์ ๋ ฌ ๋ฑ์ ๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๊ฑฐ๋ ๋ฌธ์ ์์ ๊ธฐ์กด์ ์๋ ค์ง ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ์ ์ธ ๊ฐ์ ์ ๊ฑฐ์ณ์ผ ํ ์ ์๋ค.
function descSort(n, ...rest) {
return rest.sort((a, b) => b - a).join(' ');
}function printLowScore(n, ...rest) {
const studentScore = rest.map(item => ({
name: item.split(' ')[0],
score: item.split(' ')[1]
}));
return studentScore.sort((a,b) => {return a.score-b.score}).map(item => item.name).join(' ');
}
printLowScore(2, 'ํ๊ธธ๋ 95', '์ด์์ 77')