\(@^0^@)/

[TDL] 07/17 Today's-Done-List 본문

TDL

[TDL] 07/17 Today's-Done-List

minjuuu 2022. 7. 17. 23:59
728x90

- 유데미 알고리즘 정렬

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 알고리즘 & 자료구조 마스터클래스 ]

728x90

'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