A Developing Developer

DAY 10. K 튜터님 자료구조_알고리즘 강의 (3/3), cs 특강(HTTP 본문

내일배움캠프 4기/TIL

DAY 10. K 튜터님 자료구조_알고리즘 강의 (3/3), cs 특강(HTTP

H-JJOO 2022. 11. 25. 14:48

내배캠 4기 Node.js 4기 10일차

 

이번 주 내내 알고리즘 인강을 보고 zoom 원격 강의를 듣고 공부를하고있다.

 

결론,

 

알고리즘 어렵다.

 

개념도 어렵고, 그 개념을 알아서 문제를 푸는건 더 어렵다.

 

매니저님들 튜터님들 하나같이 지금 이해안되고 못 푸는거 정상이라고 남은 기간 약 4개월 동안 계속해서 꾸준히 개념 공부하고 문제풀다보면 지금과 다를거라고 하신다.

 

이번주 처럼 계속 알고리즘을 공부하면 그럴 거 같긴한데, 당장 이번주가 너무 힘들었다.

 

인강을 들으면서 이해가 안되면 돌려보다가 돌려봐도 이해가 안되면 질문할 생각보다, 왜 이게 이해가 안되는지 자책하기가 우선이다. 

 

자연스럽게 스트레스는 쌓이더라...

 

(엄한 안경 깨먹음ㅋㅋㅋ)

 

덕분에 오늘 원격 강의 뿐만아니라 오후 자습시간도 스스로에게는 유익한 시간이지 못했다. 

 

강의해주신 강사님을 탓 할 수는 없다. 내가 이해를 못하는건 내가 그만큼 이해력이 모자라거나 예습을 대충 해서 일거다.

 

그럼 이제 내가 할 수 있는건 뭘까. 

 

TIL 마무리하고 복습이나 해야지~

 

============================================================================================

- K 튜터님 자료구조_알고리즘 강의 (3/3)

 

  • 스택
  • 후입선출 Last In First Out [LIFO]
  • 역순의 성질
  • peek : 스택 맨위의 데이터를 보는 것
def peek(self):
    if self.head is None:
        return None
   
    ### peek() 호출부 시작
    # top = stack.peek()
    # if top is None:
    #   print("Stack is empty!")
    #   ...
    ### peek() 호출부 끝
    return self.head.data
  • push : 스택의 원소를 삽입
# 맨 위에 데이터 넣기
def push(self, value):
    if self.head is None:
        return "Stack is empty"
    new_head = Node(value)  # 새로운 노드 생성
    new_head.next = self.head  # 기존 head 노드를 head.next 로 이동
    self.head = new_head  # head 노드에 새로운 노드 대입

 

    • pop : 스택의 Top 에서 원소를 가져오는 
# 맨 위의 데이터 보기 및 삭제
def pop(self):  # 가장 위에서 뽑은 데이터를 반환해줘야함
    if self.head is None:  # 만약 비어있다면
        return "Stack is empty"  # 메세지 리턴 말고 None 리턴
    delete_head = self.head  # 제거할 node 를 변수에 대입, 반환위해서
    self.head = self.head.next  # head 를 현재 head 의 다음으로 대입
    return delete_head  # 반환
  • 선입선출 First In First Out [FIFO]
  • peek: 큐의 맨앞 데이터를 보는 것
def peek(self):
    if self.is_empty():
        return "Queue is Empty"
    return self.head.data
  • enqueue : 큐 원소를 맨뒤에 삽입
def enqueue(self, value):
    new_node = Node(value)
    if self.head is None: # 비어있다면
        self.head = new_node # head에 new_node
        self.tail = new_node # tail에 new_node 대입
        return

    # 비어있지 않다면 기존 tail에 새 노드를 포인터로 연결
    self.tail.next = new_node
    # 새 노드를 tail 로 설정
    self.tail = new_node
  • dequeue : 큐 원소 뽑아오기, 맨앞 원소를 빼온다.
def dequeue(self):
    if self.head is None:
        return None
    delete_head = self.head # 제거할 node 를 변수에 대입
    self.head = self.head.next # head를 현재 head 의 다음걸로 대입
    return delete_head # 제거할 node 반환
  • 정렬 : 데이터를 순서대로 나열하는 방법
  • 버블 정렬 : 첫번째 자료와 두번째 자료, 세번째 자료와 네번째 자료 ... 마지막-1 자료와 마지막 자료 비교해서 정렬

input = [4, 6, 2, 9, 1]


def bubble_sort(array):
    n = len(array)  # array의 길이를 n에 저장해요! 루프 카운트 변수로 쓰겠죠?
    for i in range(n):  # 이건 array를 순차적으로 돌겠다는 뜻이구요!
        # 이건 버블정렬 알고리즘의 특성처럼 1개씩 줄어들면서 반복하며 비교를 해요.
        for j in range(n - i - 1):
            if array[j] > array[j + 1]:  # 앞의 원소가 뒤의 원소보다 크면 바꿔야겠죠?
                # 파이썬의 엄청난 장점! 코드 한 줄로 swap 기능을 사용해요!
                # 보통 swap(변수 a, b값을 서로 바꿈) 기능은 temp와 같은 임시변수를 쓰거나
                # XOR 연산을 이용해서 해요! 이거 진짜 엄청 편리한 기능이에요!
                array[j], array[j + 1] = array[j + 1], array[j]

    return array


bubble_sort(input)
print(input)

print("정답 = [1, 2, 4, 6, 9] / 현재 풀이 값 = ", bubble_sort([4, 6, 2, 9, 1]))
print("정답 = [-1, 3, 9, 17] / 현재 풀이 값 = ", bubble_sort([3, -1, 17, 9]))
print("정답 = [-3, 32, 44, 56, 100] / 현재 풀이 값 = ", bubble_sort([100, 56, -3, 32, 44]))
  • 선택 정렬 : index 하나마다 위치할 원소를 결정하고 그 다음에 index 로 넘어가는 기법

input = [4, 6, 2, 9, 1]


def selection_sort(array):
    n = len(array) # 루프 카운트!
    for i in range(n - 1): # 이번에는 i ~ n - 2까지 돌면서 실험군을 선택해요!
        min_index = i # i번째에 들어갈 최소값을 찾아요! 파티션!
        for j in range(n - i): # j ~ n - 1까지 돌면서 대조군을 선택해요!
            # 현재 최소값으로 설정된 친구보다 더 작은 친구를 발견하면!
            if array[i + j] < array[min_index]: # i 는 출발지! j 는 n에서 i 를 뺀
                min_index = i + j # 최소값 인덱스를 갱신합니다!
        # 루프를 한 번 돌면 최소값 선정 1번이 끝난거에요!
        # 인덱스 i에 위치할 친구의 인덱스 min_index에 위치한 친구를 i 인덱스로 보내고
        # 원래 인덱스 i에 위치한 친구는 min_index 인덱스로 보냅니다! swap!
        array[i], array[min_index] = array[min_index], array[i]
    return array


selection_sort(input)
print(input)

print("정답 = [1, 2, 4, 6, 9] / 현재 풀이 값 = ",selection_sort([4, 6, 2, 9, 1]))
print("정답 = [-1, 3, 9, 17] / 현재 풀이 값 = ",selection_sort([3,-1,17,9]))
print("정답 = [-3, 32, 44, 56, 100] / 현재 풀이 값 = ",selection_sort([100,56,-3,32,44]))
  • 삽입 정렬 : 전체에서 하나씩 올바른 위치에 "삽입" 하는 방식

input = [4, 6, 2, 9, 1]


def insertion_sort(array):
    n = len(array) # 루프 카운트!
    # 삽입 정렬의 0번째 인덱스는 정렬된 상태라고 판단하므로 인덱스가 1부터 시작해요!
    for i in range(1, n):
        # 현재 index 범위 내에서 비교를 시작하죠! 비교 방향은 끝에서부터 시작해요!
        for j in range(i):
            if array[i - j - 1] > array[i - j]: # 뒤의 값보다 앞의 값이 크면 바꿔줘요!
                array[i - j - 1], array[i - j] = array[i - j], array[i - j - 1]
            else: # 아니면 정렬된 상태이기 때문에 이번 루프는 바로 나가도 되어요!
                break
    return array

insertion_sort(input)
print(input)

print("정답 = [4, 5, 7, 7, 8] / 현재 풀이 값 = ",insertion_sort([5,8,4,7,7]))
print("정답 = [-1, 3, 9, 17] / 현재 풀이 값 = ",insertion_sort([3,-1,17,9]))
print("정답 = [-3, 32, 44, 56, 100] / 현재 풀이 값 = ",insertion_sort([100,56,-3,32,44]))

+ 재귀 함수...

 

진짜 손쓸 방법이 없던 강의였다.

 

그래도 남은거

 

1. 경우의 수 = 연산자의 개수 ^ 숫자의 개수

2. 재귀 함수에서 중요한 요소 : 종료 조건

 

그리고 더 공부해야할 개념

 

1. list comprehesion

2. for else

 

- cs 특강 [HTTP]

  • HTTP : 클라이언트와 서버 간의 자원을 교환하기 위한 TCP/IP 기반 통신 프로토콜이다.
  • HTTPS : SSL/TLS 프로토콜을 사용해 HTTP를 암호화하여 주고 받을 때 쓰는 통신 프로토콜 이다.
  • 프로토콜 : 컴퓨터 내부에서, 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는 규칙 체계, "약속"이라고 보면 된다.
  • 웹 브라우저에 www.naver.com 을 치면 발생하는 순서
  1. 웹 브라우저에 www.naver.com 를 입력한다.
  2. 사용자가 입력한 URL 주소 중 도메인 네임 부분을 DNS 서버에 검색하고, DNS 서버에서 해당 도메인 네임에 해당하는 IP 주소를 찾아온다.
  3. HTTP 프로토콜을 사용하여 페이지 URL 정보와 찾아온 IP 주소를 포함하는 HTTP 요청 메세지를 생성하고, 생성된 HTTP 요청 메세지는 TCP 프로토콜을 사용하여 인터넷 망을 통해 해당 IP 주소의 컴퓨터로 전송된다.
  4. HTTP 요청 메세지를 받은 컴퓨터(서버)는 웹 페이지 URL 정보 중 PATH 와 HTTP Method에 맞는 액션을 취한다. (여기서는 naver 페이지를 띄우기 위해 필요한 html 등의 리소스를 찾을 것이다.)
  5. 생성된 응답 데이터는 또 다시 HTTP 프로토콜을 사용하여 HTTP 응답 메세지로 만들어지고 TCP 프로토콜을 사용하여 인터넷 망을 통해 요청했던 컴퓨터(클라이언트)로 전송된다.
  6. 도착한 HTTP 응답 메세지는 웹 브라우저에 의해 브라우저 과정을 거쳐 화면에 출력되어 사용자가 볼수 있게 된다.

 

============================================================================================
출처 : https://teamsparta.notion.site/Remastered-3-dc060af15aaf4e208cdd53e63c8df34e

 

[스파르타코딩클럽] 알고보면 알기쉬운 알고리즘 강의노트 Remastered - 3일차

👨‍🏫 강의할 튜터를 소개합니다!

teamsparta.notion.site

출처 : https://teamsparta.notion.site/HTTP-HTTPS-f27bad886a4c4cf1932384f41cd77b67

 

HTTP, HTTPS

👊 오늘 특강의 목표

teamsparta.notion.site

============================================================================================

이제 2주차가 지나가는데 이놈의  알고리즘 덕분에 멘탈이 상당히 바사삭 해버린거 같다.

가능한 주말동안 복습을하고 다음주 내내 알고리즘을 공부해서 이해하는 수준까지는 끌어 올려야겠다.

 

적당히 동기들을 둘러 볼 필요가 있을 수 있겠지만, 굳이 상대적으로 잘하는 동기들을 올려다 보지 말자

 

적당한 동기부여 선에서 열 받고 열심히 공부하자.