0익명 2020. 12. 3. 22:36

OT.

-수업 출결은 HRD-NET앱과 프로그래머스 사이트 이용

-공지 사항과 QA등 모든 연락은 Slack이라는 앱 이용

-실시간 수업은 ZOOM 이용

-블로그에 배움 기록

-Git Hub으로 코드 공유

-언어는 파이썬, 개인적으로 IDE(Integrated Development Environment)는 Jupyter Notebook으로 쓸 예정

-lambda, map, filter, reduce

 

파이썬 코딩 도장: 32.2 람다 표현식과 map, filter, reduce 함수 활용하기

람다 표현식 작성 방법을 알아보았으니 이번에는 람다 표현식과 map, filter, reduce 함수를 함께 사용해보겠습니다. 32.2.1  람다 표현식에 조건부 표현식 사용하기 먼저 람다 표현식에서 조건부 표

dojang.io

 

개인적으로 공부 기록할 때, 개인 감상 같은 걸 너무 많이 적어서 공개 블로그를 팠는데 결국 여기서도 그럴 듯...

그나저나 계속 티스토리를 써왔어서 티스토리로 팠는데 velog나 notion 보니까 저것들로 옮기고 싶어짐.

깃 헙을 이용하는 것은 계속 미뤘었는데 금요일 안에 사용법을 익혀야 할 것 같다.

 


DAY01.

01강. 안녕, 자료구조 & 알고리즘

-실습: 리스트 원소 두 개의 합 구하기

 

 

02강. 선형 배열(Linear Array)

배열(array) → 파이썬에선 리스트(list) 이용

리스트 연산

.append(), .pop(), .insert(), .del(), .index()

 

-실습(1): 리스트에 새로운 요소 삽입하기

-실습(2): 리스트에서 원소 찾아내기

 

 

03강. 정렬(Sort), 탐색(Search)

sorted(), sort()

reverse=True

sort(key=lambda x: len(x))

sort(key=lambda x: x[], reverse=True)

탐색 알고리즘: 선형 탐색(linear search)=순차 탐색(sequential search), 이진 탐색(binary search)

이진 탐색은 이미 정렬되어 있는 경우에만 적용 가능

 

-실습: 이진 탐색 구현해보기

 

 

4강. 재귀 알고리즘(Recursive Algorithms) 기초

이진 트리(binary trees)

재귀 호출의 종결 조건 매우 중요

재귀 vs 반복

 

-실습: 피보나치 순열 구현하기

 

 

5강. 재귀 알고리즘(Recursive Algorithms) 응용

조합의 수 계산

하노이의 탑

피보나치 수열 - 중복 호출로 인한 성능 저하

 

-실습: 재귀적 이진 탐색 구현하기

 

 

6강. 알고리즘 복잡도(Complexity of Algorithms)

시간 복잡도(Time Complexity)와 공간 복잡도(Space Complexity)

평균 시간 복잡도(Average Time Complexity)와 최악 시간 복잡도(Worst-case Time Complexity)

Big-O Notaton: 점근 표기법(asymptotic notation)의 하나

선형 시간 알고리즘 - O(n)

로그 시간 알고리즘 - O(logn)

이차 시간 알고리즘 - O(n^2)

삽입 정렬(insert sort), 병합 정렬(merge sort)

배낭 문제(Knapsack Problem) - dynamic programming

 

-퀴즈

 

7강. 연결 리스트(Linked Lists)

추상적 자료구조(Abstract Data Structures)

기본적 연결 리스트 - Node(Data, Link(next)), Head, Tail, NodeCount

단방향 연결 리스트 (singly linked list)

첫 노드에 1을 지정(0이 아닌 1부터 시작)

연산 정의

1.특정 원소 참조(k번째) - def getAt(self, pos)

2.리스트 순회

3.길이 얻어내기

배열 vs 연결 리스트

 

-실습: 연결 리스트 순회 구현하기

 

 

8강. 연결 리스트(Linked Lists) (2)

연산 정의

4.원소 삽입 - def insertAt(self, pos, newNode)

삽입하려는 위치가 리스트 맨 앞일 때 - prev가 없으므로 head 조정 필요

삽입하려는 위치가 리스트 맨 끝일 때 - tail 조정 필요

빈 리스트에 삽입할 때 - 위 두 조건에 의해 처리

5.원소 삭제 - def popAt(self, pos)

삭제하려는 node가 맨 앞일 때 - prev가 없으므로 head 조정 필요

리스트 맨 끝의 node를 삭제할 때 - tail 조정 필요

유일한 노드를 삭제할 때

6. 두 리스트 합치기 - def concat(self, L)

뒤에 붙일 리스트가 비어있는 경우

 

9강. 연결 리스트(Linked Lists) (3)

삽입과 삭제가 유연하다는 것이 큰 장점

새로운 메서드 - insertAfter(prev, newNode), popAfter(prev)

맨앞에 dummy node를 추가한 형태로

1.길이 얻어내기

2.리스트 순회 - def traverse(self)

3.특정 원소 참조(k번째) - def getAt(self, pos) getAt(0) → head

4.원소의 삽입 - def inserAfter(self, prev, newNode)

pos 범위 조건 확인

pos == 1 인 경우에는 head 뒤에 새 node 삽입

pos == nodeCount + 1 인 경우는 prev ← tail

그렇지 않은 경우에는 prev ← getAt

5.원소의 삭제 -  def popAfter(self, prev)

prev가 마지막 node일 때 (prev.next == None) 삭제할 Node없음 return None (?) -> 없어도 실행 가능

리스트 맨 끝의 node를 삭제할 때 (curr.next == None) tail 조정 필요

6.두 리스트 합치기 - def concat(self, L)

 

10강. 양방향 연결 리스트(Doubly Linked Lists)