본문 바로가기

카테고리 없음

TIL

4.29 

 

알고리즘 강의 4일차✍

 

- 스택과 큐

- 기초적인 정렬 알고리즘(버블 정렬, 선택 정렬, 삽입 정렬)

 

스택과 큐

 

스택

• LIFO(Last In First Out)의 성격을 가진 자료구조

• 스택이 넘치면 StackOverflow 가 된다. ex)무한루프 발생

• 스택에서 사용할 수 있는 대표적인 기능

- 픽 : 스택의 Top(맨 위) 데이터를 보는 것

- 푸시 : 스택에 원소를 삽입하는 행위

- 팝: 스택의 Top에서 원소를 가져오는 행위

스택의 pop 함수 구현해보기
pop() {
if (this.head === null) {      //스택이 비어있으면
return null;}                  // 여기서도 메세지를 리턴하지말고 null 리턴
let data = this.head;
this.head = data.next;
return data; }

 

• FIFO(First In First Out)의 성격을 가진 자료구조

• 대표적으로 서버에 접속하기 위해 대기하고 있는 유저들을 모아놓은 큐가 서버 접속 대기열 큐라고 볼 수 있다

-픽(peek) : 큐의 맨 앞 데이터 보는 것

-enqueue(삽입) : 큐에 원소를 삽입하는 행위. 원소는 맨 뒤(Rear)에 들어가게 됨

-dequeue(뽑기) : 큐에서 원소를 뽑아오는 행위. 맨 앞에 위치한 원소를 뽑아온다 


enqueue(value) {
    const newNode = new Node(value);

    if (this.head === null) { // 만약 비어있다면,
      this.head = newNode; // head(Front)에 new_node를
      this.tail = newNode; // tail(Rear)에 new_node를 넣어줍니다!
    } else {
      // 비어있지 않다면 기존 tail에 새 노드를 포인터로 연결하고요! 
      this.tail.next = newNode; 
      // 새 노드를 tail로 설정해요!
      this.tail = newNode;
    }
}

 

정렬 알고리즘

•  버블 정렬 

1.배열 함수를 만든다

2. 반복문을 사용해서 배열안에 숫자 갯수만큼 비교

3. 만약 i번째와 i+1 번째 비교하여  i가 크다면 i를 남긴다.

• 선택 정렬

• 삽입 정렬

function bubbleSort(array) {
   let n = array.length; // array의 길이를 n에 저장해요! 루프 카운트 변수로 쓰겠죠?
   for (let i = 0; i < n; i++) { // 이건 array를 순차적으로 돌겠다는 뜻이구요!
     // 이건 버블정렬 알고리즘의 특성처럼 1개씩 줄어들면서 반복하며 비교를 해요.
   for (let j = 0; j < n - i - 1; j++) { // n-1 -> n-1-1 -> n-2-1
      if (array[j] > array[j + 1]) { // 앞의 원소가 뒤의 원소보다 크면 바꿔야겠죠?
           let temp = array[j];
            array[j] = array[j + 1];
              array[j + 1] = temp;
        }
     } }
return array;
}
console.log("정답 = [1, 2, 4, 6, 9] / 현재 풀이 값 = ", bubbleSort([4, 6, 2, 9, 1]));
console.log("정답 = [-1, 3, 9, 17] / 현재 풀이 값 = ", bubbleSort([3,-1,17,9]));
console.log("정답 = [-3, 32, 44, 56, 100] / 현재 풀이 값 = ", bubbleSort([100,56,-3,32,44]));

 

콜백 지옥과 비동기 제어

 

1. 콜백지옥이란
    1) 콜백 함수를 익명 함수로 전달하는 과정이 반복되어 코드의 들여쓰기 수준이 헬 수준인 경우를 말한다.
    2) 주로 이벤트 처리 및 서버 통신과 같은 비동기적 작업을 수행할 때 발생한다
    3) 뭐가문제일까? 가독성이 정말 지옥(hell)이고 오랜 상태로 이렇게 짜여왔기 때문에, 수정도 어렵습니다.

 

2.동기와 비동기

  1) 동기 : synchronous
    a. 현재 실행중인 코드가 끝나야 다음 코드를 실행하는 방식을 말한다
    b. CPU의 계산에 의해 즉시 처리가 가능한 대부분의 코드는 동기적 코드다.
    c. 계산이 복잡해서 CPU가 계산하는 데에 오래 걸리는 코드 역시도 동기적 코드이다.


   2) 비동기 : a + synchronous ⇒ async라고들 흔히 부른다
    a. 실행 중인 코드의 완료 여부와 무관하게 즉시 다음 코드로 넘어가는 방식
    b. setTimeout, addEventListner 등
    c. 별도의 요청, 실행 대기, 보류 등과 관련된 코드는 모두 비동기적 코드
    d. 웹의 복잡도가 올라갈 수록 비동기적 코드의 비중이 늘어남.

 

 3. 비동기 작업의 동기적 표현

   1) Promise

   2) Generator

   3) Promise + Async/await

 

 

개인과제에 대한 것🥺

- 미완성 상태로 제출..

과제의 필수 요소였던 영화 검색기능을 구현하고 싶어서

여러 방법으로 시도해봤는데 빈검색어를 눌렀을때는 '검색어를 입력'하라는 알람은

뜨는 데 영화검색은 작동하지 않았다.

-내일은 오전에 코드카타 1시간하고 개인과제해설 보면서 검색기능 구현해봐야겠다

 

 

혼자 메모 끄적인 것👀

- setInterval : 반복해서 매개변수로 받은 콜백함수의 로직을 수행

- 동기는 일의 순서가 중요

- 비동기 - 순서를 보장하지 않음

-refactoring (re : 다시 , factoring : 구조화   => 다시 구조화한다)

 : 비효율적인 코드를 효율적인 코드로 변경할 때 자주 쓰임

 

- 제너레이터 - 반복할 수 있는 이터러블 객체를 생성한다