좋은 코드란 뭐라고 생각? (또는 개발 업무 협업 시 중요한 것)
안좋은 코드란 뭐라고 생각?
절차적 프로그래밍이란
객체 지향 프로그래밍이란 (OOP : Object-Oriented Programming)
객체지향 프로그래밍의 특징
오버로딩과 오버라이딩 차이
TDD란 무엇이고, 어떤 장점이 있는지
TDD의 테스트 케이스 만들 때 주의사항
링크드리스트 내용 추가)
- 한 노드를 삽입/삭제할 때, 다음 노드 주소만 변경하면 되므로, O(1)만에 해결 가능
- 데이터 검색 시 첫 번째 원소부터 다 확인해야되므로, O(n)이 걸린다.
- 이때, 삽입/삭제할 노드를 찾아가는 시간이 필요하니까 삽입/삭제도 결국 O(n)이 된다.(중요)
- 링크드리스트는 Tree구조의 근간이 되는 자료구조다.
class Node:
def __init__(self, data):
self.data = data # 입력받은 데이터(=val)
self.next = None # 다음 노드 주소
class LinkedList:
def __init__(self, data):
self.head = Node(data) # 맨 처음에 생성 시, 데이터 하나 입력받고, 걔를 head로
# 맨 끝에 노드를 추가하는 함수
def append(self, data):
current = self.head # 현재 링크드 리스트의 head부터 이동 시작
while current.next is not None: # 끝까지 이동
current = current.next
current.next = Node(data) # (중요) 끝까지 갔다면 데이터(노드 객체를!!!) 추가
# 특정 노드의 인덱스 찾는 함수 (삽입/삭제 시 활용)
def get_node(self, index):
cnt = 0 # 이동중인 인덱스 상황
node = self.head # 인덱스가 없으므로, head부터 이동해야함
while cnt < index:
cnt += 1
node = node.next # 한칸씩 이동하는 것!!
return node # 특정 노드를 찾았다면
# 원하는 위치에 노드를 추가하는 함수
def add_node(self, index, data):
new_node = Node(data)
# 만약 맨 앞에 넣고싶다면, head보다 앞에 넣어준다.
if index == 0:
new_node.next = self.head # 1.새 노드의 다음 노드를 head로 지정
self.head = new_node # 2.링크드 리스트의 head를 새 노드로 지정
return
# 특정 인덱스에 넣는다면
node = self.get_node(index - 1) # 삽입할 인덱스까지 찾아간다(index는 0부터)
tmp_node = node.next # tmp <- A
node.next = new_node # A <- B
new_node.next = tmp_node # B <- tmp
# 원하는 위치에 노드를 삭제하는 함수
def delete_node(self, index):
# 만약 맨 앞 노드 삭제하고 싶다면
if index == 0:
self.head = self.head.next # 그 다음 노드꺼로 바로 바꿔주면 됨
return
# 특정 인덱스껄 삭제한다면
node = self.get_node(index - 1) # 삽입할 인덱스까지 찾아간다(index는 0부터)
node.next = node.next.next # (중요) 그 위치에 있던 노드가 가리키는 next 노드의 next노드를 끌어오면 됨
선형 자료구조와 비선형 자료구조
스택과 큐 차이 (기존에 정리했던거로 외우자)
스택 코드 - 코테본거 넣자
큐 코드
출처 링크 : https://somjang.tistory.com/entry/파이썬으로-구현하는-자료구조-큐-Queue
dequeue 내용 중요!!
class Queue():
def __init__(self):
self.queue = []
def enqueue(self, data):
self.queue.append(data)
def dequeue(self):
dequeue_object = None
if self.isEmpty():
print("Queue is Empty")
else:
dequeue_object = self.queue[0] # deque할 맨앞 데이터 저장해두고
self.queue = self.queue[1:] # 앞에서 두 번째부터 슬라이싱으로 옮겨줌
return dequeue_object
# dequeue랑 달리, 맨 앞 데이터만 확인
def peek(self):
peek_object = None
if self.isEmpty():
print("Queue is Empty")
else:
peek_object = self.queue[0]
return peek_object
def isEmpty(self):
is_empty = False
if len(self.queue) == 0:
is_empty = True
return is_empty
Tree 설명
Binary Tree 설명 (이진트리 설명)
Full binary tree 설명 (정 이진 트리 설명)
Complete binary tree 설명 (완전 이진 트리 설명)
BST 설명 (Binary Search Tree 설명)
BST의 검색 시간복잡도
Max Heap 설명 (최대 힙 설명)
Min Heap 설명 (최소 힙 설명)
그래프란
그래프에서 degree란
인접행렬이란 (adjacent matrix란)
인접 리스트란 (adjacent list란)
그래프 탐색방법에 대해 설명
DFS 설명 (깊이 우선 탐색 설명)
BFS 설명 (너비 우선 탐색 설명)
DFS 장단점
BFS 장단점
Minimum Spanning Tree 설명 (MST 설명)
Kruskal Algorithm 설명 (크루스칼 알고리즘 설명)
Prim Algorithm 설명 (프림 알고리즘 설명)