A Developing Developer
DAY 10. K 튜터님 자료구조_알고리즘 강의 (3/3), cs 특강(HTTP 본문
내배캠 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 을 치면 발생하는 순서
- 웹 브라우저에 www.naver.com 를 입력한다.
- 사용자가 입력한 URL 주소 중 도메인 네임 부분을 DNS 서버에 검색하고, DNS 서버에서 해당 도메인 네임에 해당하는 IP 주소를 찾아온다.
- HTTP 프로토콜을 사용하여 페이지 URL 정보와 찾아온 IP 주소를 포함하는 HTTP 요청 메세지를 생성하고, 생성된 HTTP 요청 메세지는 TCP 프로토콜을 사용하여 인터넷 망을 통해 해당 IP 주소의 컴퓨터로 전송된다.
- HTTP 요청 메세지를 받은 컴퓨터(서버)는 웹 페이지 URL 정보 중 PATH 와 HTTP Method에 맞는 액션을 취한다. (여기서는 naver 페이지를 띄우기 위해 필요한 html 등의 리소스를 찾을 것이다.)
- 생성된 응답 데이터는 또 다시 HTTP 프로토콜을 사용하여 HTTP 응답 메세지로 만들어지고 TCP 프로토콜을 사용하여 인터넷 망을 통해 요청했던 컴퓨터(클라이언트)로 전송된다.
- 도착한 HTTP 응답 메세지는 웹 브라우저에 의해 브라우저 과정을 거쳐 화면에 출력되어 사용자가 볼수 있게 된다.
============================================================================================
출처 : https://teamsparta.notion.site/Remastered-3-dc060af15aaf4e208cdd53e63c8df34e
출처 : https://teamsparta.notion.site/HTTP-HTTPS-f27bad886a4c4cf1932384f41cd77b67
============================================================================================
이제 2주차가 지나가는데 이놈의 알고리즘 덕분에 멘탈이 상당히 바사삭 해버린거 같다.
가능한 주말동안 복습을하고 다음주 내내 알고리즘을 공부해서 이해하는 수준까지는 끌어 올려야겠다.
적당히 동기들을 둘러 볼 필요가 있을 수 있겠지만, 굳이 상대적으로 잘하는 동기들을 올려다 보지 말자
적당한 동기부여 선에서 열 받고 열심히 공부하자.
'내일배움캠프 4기 > TIL' 카테고리의 다른 글
DAY 12. JavaScript 올인원, 타임 어택 1회차 (0) | 2022.11.29 |
---|---|
DAY 11. 알알알 복습, W 튜터님 Javascript 특특강 (+머리아픔이슈) (0) | 2022.11.28 |
DAY 9. K 튜터님 자료구조_알고리즘 강의(2/3), 알고보면 알기쉬운 알고리즘 - 3 (0) | 2022.11.24 |
DAY 8. K 튜터님 자료구조_알고리즘 강의(1/3), 개구간, 폐구간, 알고보면 알기쉬운 알고리즘 - 2 (0) | 2022.11.23 |
DAY 7. 알고보면 알기쉬운 알고리즘 - 1주차 (0) | 2022.11.22 |