\(@^0^@)/
[TDL] 07/17 Today's-Done-List 본문
- 유데미 알고리즘 정렬
function pivot(arr, start = 0, end = arr.length-1) {
const swap = (arr, idx1, idx2) => {
[arr[idx1], arr[idx2]] = [arr[idx2], arr[idx1]];
}
let pivot = arr[start];
let swapIdx = start;
for(let i = start + 1; i <= end; i++) {
if (pivot > arr[i]) {
swapIdx++;
swap(arr, swapIdx, i);
}
}
swap(arr, start, swapIdx);
return swapIdx;
}
function quickSort(arr, left = 0, right = arr.length-1) {
if(left < right) {
let pivotIndex = pivot(arr, left, right)
quickSort(arr, left, pivotIndex-1);
quickSort(arr, pivotIndex+1, right);
}
return arr;
}
quickSort([4,6,9,1,2,5,3]) // [1, 2, 3, 4, 5, 6, 9]
퀵 정렬은 그림을 보면서는 어느 정도 구현 방식을 이해하겠는데, 코드를 보면서 이해하려니까 너무 어렵다..
다음번에 문제들을 보면서 익혀야 될 것 같음.
- 인프런 함수형 프로그래밍 강의 + 책
map, filter
function _filter(users, predi) {
let new_list = [];
for (let i = 0; i < users.length; i++) {
if (predi(users[i])) {
new_list.push(users[i]);
}
}
return new_list;
}
console.log(
_filter(users, function (user) {
return user.age >= 30;
}),
);
사실 이렇게 필터를 적용해서 고객정보를 나타내는 함수들은 중복되는 코드들이 많기 때문에, 이런 식으로 필터 함수를 사용해서 나타내면 좋다. 근데 강의를 보고, 저 함수의 식을 이해하는데 생각보다 오래 걸렸다ㅠ
저게 된다고...?라는 생각이 들면서, 고차 함수를 아직 제대로 이해하지 못했다는 생각이 들어, 조금 더 연습해보아야 할 것 같다.
filter함수를 다시 살펴보면,
- 첫 번째 인수로 users를 받아서 users의 length만큼 for loop을 돈다.
- 반복을 하면서 i번째 users를 predi에 적용한다.
- 그때마다 콘솔의 두 번째 파라미터에 있는 함수가 실행될 것임 즉, 현재 users의 길이는 7이기 때문에, 7번을 돌면서 조건문이 실행될 것이다.
- 그리고, 7번의 실행 중에 user.age >= 30에 해당하는 users [i]들만 new_list에 push 될 것이다.
- 그 데이터들이 담긴 new_list를 return 하고, 콘솔에 찍히게 될 것이다.
- 따라서, 어떤 조건에 push를 할 것이냐에 대해서 바깥의 콘솔에 있는 함수에게 위임하는 식으로 구현되는 filter 함수이다.
사실 저 filter 함수는 users만을 위한 함수가 아니라, 전체적으로 모든 것을 필터링해줄 수 있는 함수임.
console.log(_filter([1,2,3,4], function(num) { return num % 2 })); // [1, 3]
console.log(_filter([1,2,3,4], function(num) { return !(num % 2) })); // [2, 4]
따라서, filter함수에서 인자로 받는 부분을 변경해준다면 다방면에서 사용 가능한 재사용성이 좋은 함수가 된다.
function _filter(list, predi) {
let new_list = [];
for (let i = 0; i < list.length; i++) {
if (predi(list[i])) {
new_list.push(list[i]);
}
}
return new_list;
}
function _map(list, mapper) {
let new_list = [];
for (let i = 0; i < list.length; i++) {
new_list.push(mapper(list[i]));
}
return new_list;
}
let over_30 = _filter(users, function (user) { return user.age >= 30 });
let names = _map(over_30, function(user) { return user.name });
let ages = _map(over_30, function(user) { return user.age });
console.log(names) // ['BB', 'CC', 'DD', 'GG']
console.log(ages) // [35, 91, 48, 50]
map도 마찬가지로, 유틸 함수를 생성해놓는다면 높은 재사용성으로 함수를 활용할 수 있다.
map함수도 살펴보자. (변수 names 기준)
- filter함수가 적용되면서 age가 30을 넘는 user들을 필터로 걸러낸다.
- new_list에 push 할 인자를 mapper에 위임함으로써, mapper함수가 실행된다.
- 변수 names의 두 번째 파라미터에 있는 함수가 실행되면서, user가 list의 i번째로 넘어오게 되면서 user의 name을 return 해준다.
map 함수 또한 users만을 위한 함수가 아니며, 다양한 값들을 mapping 해줄 수 있다.
console.log(_map([1, 2, 3], function(num) { return num * 2 })); // [2, 4, 6]
console.log(_map([1, 2, 3], function(num) { return num % 2 })); // [1, 0, 1]
filter 함수와 map 함수를 한 번에 사용해서 원하는 user의 데이터를 찾아내고 싶은 경우에는
console.log(
_map(
_filter(users, function(user) { return user.age >= 30 }),
function(user) { return user.name }))
/*
{id: 2, name: 'BB', age: 35}
{id: 3, name: 'CC', age: 91}
{id: 4, name: 'DD', age: 48}
{id: 7, name: 'GG', age: 50}
['BB', 'CC', 'DD', 'GG']
*/
이렇게 한 번에 넣어서 코드를 작성할 경우, 간결하며 테스트가 쉽고 에러가 적고 안정성이 높게 구현이 가능하다.
주말 회고 (만족도 : 6)
이번 주는 몸이 안 좋은 날이 많아서 여유롭게 진행하였음..
내일부터는 목표한 것들이 뒤로 밀리지 않도록 노력해보자. 그러려면 더더 일찍 일어나야 한다.
최근에 다시 슬슬 늦게 자기 시작했는데... 늦어도 1시 이전에 잘 수 있도록 노력해보자ㅠ.ㅠ
[출처 : 자바스크립트로 알아보는 함수형 프로그래밍 (ES5),
JavaScript 알고리즘 & 자료구조 마스터클래스 ]
'TDL' 카테고리의 다른 글
[TDL] 07/19 Today's-Done-List (0) | 2022.07.19 |
---|---|
[TDL] 07/18 Today's-Done-List (0) | 2022.07.18 |
[TDL] 07/16 Today's-Done-List (0) | 2022.07.17 |
[TDL] 07/15 Today's-Done-List (0) | 2022.07.15 |
[TDL] 07/13 Today's-Done-List (0) | 2022.07.13 |