IT 5분 잡학사전 #6

Noah·2023년 1월 20일
0

개발 도서

목록 보기
6/9
post-thumbnail

TIL 날짜 및 읽은 범위

  • 2023.01.21
  • Ep.26 ~ Ep.29

에피소드 26 : 정렬 알고리즘이 뭐죠?

버블 정렬 Bubble sort

왼쪽, 오른쪽만 보면서 정렬
2칸짜리 창문을 놓고 오른쪽으로 1칸씩 밀면서 왼쪽과 오른쪽을 비교하는 정렬 방식
오름차순 기준: 왼쪽이 크면 오른쪽과 자리를 바꿈 = 한 사이클
비교횟수, 교환 횟수 등을 고려하면 시간 복잡도는 "O(N2){O(N^2)}" 이다
버블정렬 포크댄스

선택 정렬 Selection sort

하나를 콕! 집어 가며 정렬
전체 데이터 중에서 가장 작은 데이터 또는 가장 큰 데이터의 위치를 따로 기억하는 방식
선택 정렬의 시간 복잡도는 "O(N2){O(N^2)}"
하지만 버블 정렬 보다는 훨씬 효율적 > 자리를 바꾸는 연산은 사이클당 1번씩만 함

삽입 정렬 Insertion sort

앞에 있는 데이터를 보면서 배치하는 정렬
포인트는 교환이 아니라 밀어 넣는다는 것!
삽입 정렬의 시간 복잡도는 "O(N2){O(N^2)}"
하지만 선택정렬, 버블 정렬 보다 빠르다

어? 재밌네? 정렬 알고리즘, 한방에 이해하기!- 노마드코더 유튜브 영상

시간 복잡도는 같은데 왜 속도 차이가 날까 ?

시간 복잡도가 같다고 한 것은 시간 복잡도를 단순히 측정 했을 때 그렇다는 뜻이야
하지만 알고리즘은 초기 데이터 상태에 따라 처리 속도가 달라진다는 특징이 있어
그래서 기계적으로 측정한 시간 복잡도는 같아도 평균적으로 빠른 알고리즘이 있을 수 있다는 거야

에피소드 27 : 스택, 큐가 뭐죠 ?

큐나 스택은 배열처럼 실제로 존재하는 개념은 아니야
큐나 스택은 기존 프로그래밍 언어의 문법으로 데이터를 저장할 때 어떤 규칙만 부여하기만 하면 되기 때문
이런 개념을 추상 자료구조(abstract data type, ADT) 라고 해
큐나 스택이나 뭘로 구현해도 상관없다. 규칙만 잘 지키면 된다

스택 (Stack)큐 (Queue)
펜케이크!버스정류장
배열이 수직으로 쌓여 있고, 맨 위를 지정함
값을 추가 하거나 삭제할 때, 맨 위라고 정해 놓은 부분에서만 작업먼저 들어온 데이터가 먼저 빠져나감
데이터를 중간에서 빼거나 할수 없음
위에서 데이터를 쌓는다위로 데이터를 쌓는다
위에서 부터 데이터를 뺀다아래에서부터 데이터를 뺀다
LIFO(last in, first outFIFO(first in, first out)
웹 브라우저 뒤로 가기, 되돌리기 단축키쇼핑몰에서 주문을 처리하는 방식

에피소드 28 : 해시 테이블이 뭐죠 ?

개발자가 가장 많이 하는 고민은?! "어떻게 하면 프로그램의 속도를 더 빠르게 만들 수 있을까?

해시 테이블 콘셉트 이해하기

해시 테이블은 키와 값을 짝지어 모은 것

// 배열로 된 메뉴판 
menu = [
  { name: "아메리카노", price: 10 },
  { name: "라떼", price: 12 },
  { name: "카모마일차", price: 15 },
  { name: "케이크", price: 45 },
]
// 해시 테이블로 된 메뉴판 
menu = {
  커피: 10,
  라떼: 12,
  카모마일차 : 15,
  케이크: 45,
};

배열 검색과 해시 테이블 검색의 시간 복잡도 차이는 ?

선형 검색의 시간 복잡도는 O(N) 이야
해시 테이블은 ?! 무려 O(1) 이야
Big-O 표기법으로 표현할 수 있는 가장 빠른 시간 (상수 시간) 이지
해시 테이블에서는 어떤 값을 찾더라도 딱 한 단계만 거쳐
데이터를 추가, 삭제할 때도 O(1) 이니까

해시 테이블을 조금 더 자세히 알아보고 싶어요

해시 테이블은 배열 형태로 구성되어 있어
해시 테이블 속도의 비결은 해시함수
해시 함수는 여러분이 검색할 때 쓰는 키를 숫자, 즉 인덱스로 바꿔 주는 역할을 해

만약 해시 함수가 키의 글자수 그대로 인덱스를 반환하도록 구성했다고 생각해보자!
문제 발생! 글자수가 같으면 어떻게 해야할까 ?
이런 상황을 전문 용어로 해시충돌(hash collison) 이야
해시 충돌 대처 방법에는 여러가지가 있는데 하나만 소개 할게
같은 인덱스에 또 다른 배열을 넣는거야

이러한 이유로 해시 테이블에서 검색은 사실 항상 O(1)은 아니야
지금처럼 충돌을 추가로 처리해야 할 수도 있거든

에피소드 29 : 개발자 필수 소양, 클린 코드!

클린 코드를 위한 5가지 꿀팁

클린 코드란! 설명이 필요없는 코드를 말해! 코드를 읽기만 해도 이 코드가 무슨 일을 하는지, 어떤것을 의미하는지 물어볼 필요도 없이 스르륵 이해되는 그런 코드 말이지!

클린 코드는 협업에서 무척 중요해!
또한 혼자 일 할때에도 중요해!
잘 실행되면서 부연 설명을 하지 않아도 이 코드만 봐도 충분히 설명할 수 있는 상태! 클린 코드는 그런 것이야!

클린 코드 백서 1. 의미 있는 변수, 함수의 이름을 적절히 사용하라

setInterval(eatKimchi, 86400); // 86400 ? 무슨 뜻이지 ?
const SECONDS_IN_A_DAY = 86400;
setInterval(eatKimchi, SECONDS_IN_A_DAY) // 아! 하루를 초로 바꾼거구나!!

클린 코드 백서 2. 함수 이름은 가급적 동사로 지어라

function userDate() {
  ...
}
function loadUserDate() {
  ...
}

함수 이름을 보면 '사용자의 데이터를 불러오는 함수구나'라고 유추할 수 있지?
그리고 함수는 1가지 역할만 하는 것이 좋아

클린 코드 백서 3. 매개변수는 너무 많이 쓰지 마라
나는 3개 이하여야 한다고 생각해

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: '니꼬'
})

클린 코드 백서 4. 블린값을 인자로 보내지 마라

function sedMessage(text, isPrivate){
  if(isPrivate){
    ...
  } else {
    ...
  }
}

if~else 문은 실행분기를 나누는 문법인데, 그렇다면 sedMessage 함수에서 isPrivate의 참, 거짓에 따라 2가지 일을 처리해야 한다는 것을 의미해
'함수는 1가지 일만 잘해야 한다' 는 규칙에 위배돼
그러니 불린값은 인자로 보내지 않는 것이 좋아

클린 코드 백서 5. 축약어를 쓰지 마라
나 혼자만 알아 볼 수 있을 만한 축약어를 쓰면 안돼
누가 u, e 를 보고 user, email 을 떠올리겠어? 너무 황당하잖아

우리가 코딩할 때는 창의력이 뿜뿜! 넘치는 상태가 되는데, 그때 보통 앞에서 언급한 좋지 않은 습관, 클린하지 못한 습관이 많이 나와
만약 그렇다고 해도 좌절할 필요가 없어!
어떤 개발자도 처음부터 코드를 클린하게 작성하지 못하니까 말야. 원래 코드가 머릿속에서 막 떠오를 때에는 클린한 코드를 작성하기 힘들어!
잘 실행되는 코드를 막 쓰고 나중에 치워
그 대신 마지막에는 항상 클린하게 코드를 다듬는 작업을 하면 돼!!

오늘 읽은 소감은?

"알고리즘을 시작하고 조금씩 내용이 어려워지는 것 같다는 생각이 들었다. 그래도 예시와 유튜브 설명을 몇 번 읽으니 조금씩 이해가 되는거 같다. 특히 스택과 큐를 설명할 때 팬케이크랑 버스정류장은 절대 잊지 못 할 것이다.""
""좋은 코드는 무엇일까? 생각하면 제일 먼저 떠오르는 건 가독성이 좋은 코드라고 생각한다. 코드를 읽지 못 한다면, 그 코드를 사용할 수 없기 때문이다. 현재의 내가 만든 코드라도 미래의 내가 읽을 수 있도록, 나와 함께하는 동료들이 쉽게 읽을 수 있는 코드가 제일 중요하다고 생각한다. 그래서 클린 코드가 중요하다고 생각하고 있었다. 그러던 중에 니꼬쌤이 팁을 5가지나 알려주다니!! 오늘도 일용할 양식을 줍줍해간다"

profile
프론트엔드가 꿈인 코린이

0개의 댓글