leesulog.

lightdark
[북클럽 챌린지] DAY 9
2023-01-217 min read
  • Book
thumbnail

DAY 9

🔖 오늘 읽은 범위 : 에피소드 26 ~ 29

  1. 정렬 알고리즘이 뭐죠?
  2. 스택, 큐가 뭐죠?
  3. 해시 테이블이 뭐죠?
  4. 개발자 필수 소양, 클린 코드!

😃 기억하고 싶은 내용

  • 정렬(sorting) 알고리즘
    시간 복잡도는 같으면서 성능은 다른 정렬 알고리즘 3가지

    • 버블(bubble sort)정렬 : 2개의 창문을 두고 왼쪽과 비교하며 하나씩 오른쪽으로 이동하는 알고리즘
    • 선택(selection sort)정렬 : 하나를 콕 집어가며 정렬하는 알고리즘. 한번씩 사이클을 돌면서 기준이 되는 숫자와 가장 작은 숫자의 인덱스를 교환.
    • 삽입(insertion sort)정렬 : 앞에 있는 인덱스와 비교해 작으면 앞으로 밀어넣으며 배치하는 알고리즘. 교환이 아니라 밀어 넣는 식

    → 모두 시간복잡도는 O(N²) 기계적으로 측정한 시간복잡도는 같아도 평균적으로 빠른 알고리즘은 있을 수 있다. 정렬에는 어떤 작업이 필요하고, 시간복잡도는 상황에 따라 다를 수도 있다는 컨셉트를 이해해야 한다.

  • 스택(stack)과 큐(queue)
    추상 자료구조(abstrack data type, ADT): 문법이 아닌 어떤 규칙을 부여하는 것
    → 배열에 큐의 규칙을 부여하면 그 배열은 큐이다.

    스택
    비유 팬케이크 버스 정류장
    규칙 1. 위에서 데이터를 쌓는다.
    2. 위에서부터 데이터를 뺀다.
    1. 위로 데이터를 쌓는다.
    2. 아래에서부터 데이터를 뺀다.
    줄임말 LIFO (last in, first out) FIFO (first in, first out)
    선입선출
    예시 웹 브라우저의 뒤로가기 버튼
    되돌리기(cmd+Z)버튼
    쇼핑몰 주문처리 시스템
  • 해시 테이블 : 키와 값을 짝지어 모은 것
    어떻게 하면 프로그램의 속도를 더 빠르게 만들 수 있을까?

    • 배열 VS 해시 테이블 비교

      menu = [
      {name:'커피', price: 10},
      {name:'라떼', price: 12},
      {name:'차', price: 15},
      {name:'케이크', price: 45},
      ]
      // 배열
      
      menu = {
        커피 : 10,
        라떼 : 12,: 15,
        케이크 : 45
      }
      // 해시 테이블 (키:값)
    • 배열 검색과 해시 테이블 검색의 시간복잡도

      • 배열 선형 검색 시간복잡도 : O(N)
      • 해시 테이블 검색 : O(1) 가장 빠른 상수시간! → 어떤 값을 찾더라도 딱 한 단계만 거쳐.
    • 해시테이블 속도의 비결

      • 해시 함수 : 검색할 때 쓰는 키를 인덱스로 바꿔주는 역할
  • 클린 코드
    설명이 필요없는 코드, 잘 실행되면서 이 코드만 봐도 충분히 설명할 수 있는 상태.

    1. 의미있는 변수, 함수의 이름을 적절히 사용하라.

      setInterval(eatKimchi, 86400); // 86400이 무슨 뜻이지?
      
      const SECONDS_IN_A_DAY = 86400;
      setInterval(eatKimchi, 86400); // 아! 하루를 초로 바꾼 값이구나~
    2. 함수 이름은 가급적 동사로 지어라.
      : 함수의 이름은 동사로, 함수는 1가지 액션을 잘 수행해야한다. 함수를 설계하는 시점부터 함수가 해야하는 역할을 명확하게 지정해야 한다.

      function userData() {...} //  무슨 함수지? 그냥 사용자 데이터?
      function loadUserData() {...} // 아! 사용자 데이터를 호출하는 함수구나~
    3. 매개변수는 너무 많이 쓰지 마라. (3개 이하, 또는 configuration object으로)
      : 함께 일하는 사람이 숫자만 보는 것으로는 함수의 역할을 파악하기가 힘들다.

      function makePayment(price, productId, size, quantity, userId) {}
      makePayment(35,5,’xl’,2,’니꼬’) // 매개변수가 너무 많아..
      
      function makePayment({price, productId, size, quantity, userId}) {}
      makePayment({
        price: 35,
        productId: 5,
        size: ’xl’,
        quantity: 2,
        userId : ’니꼬’
      }) // 함수를 파악하기 좋네! (configuration object 방식)
    4. 불린값을 인자로 보내지 마라.
      : 불린값을 함수의 인자로 보낼경우 참,거짓에 따라 2가지 일을 처리해야 한다는 것을 의미한다.
      → 함수는 1가지 일만 잘해야 한다는 규칙에 위배된다.

    5. 축약어를 쓰지 마라.
      : 나 혼자만 알아볼 수 있을만한 축약어를 쓰면 안됨 (예: user → u)


🤔 오늘의 파트에 대한 소감

  • 내용이 정말 알찼고, 특히 친숙하면서도 성능에 따라 분류될 수 있는 정렬 알고리즘을 알게되어서 좋았다. 정렬 기능을 사용하기 위해 구글링해서 사용했던 알고리즘이 버블 알고리즘이라는 것도, 비효율적이라는 것도.
  • 스택과 큐라는 추상 자료구조를 배웠는데 팬케이크와 버스정류장이라는 비유로 이해하기 쉬웠다. 나도 쉽게 설명할 수 있는 능력이 있었으면 좋겠다.
  • 나은 개발을 위해 개념을 공부하는 데에 게을리하지 말아야겠다.

🔎 추가로 알게 된 것

(책 내용 +알파로 궁금한 것, 이해가 가지 않는 것 등)


🤟소감 3줄 요약

  • 클린코드 읽어보고 싶다.
  • 클린코드 읽어보고 싶다.
  • 클린코드 읽어보고 싶다.
Profile Image

leesul, 이슬

frontend developer
스스로 올바른 선택을 할 수 있는 사람이 될 것

© 2024. leesul all rights reserved.