2중 3중 반복문이 되더라도, 전체 경우의 수가 적을 각이 나오면 상관 없다. 모든 경우의 수를 나열하고 따져야 하는 문제들도 꽤 있기 때문
앞으로도 queue, BFS 등을 종종 써먹게 될 것이다
효과적이고 효율적인 알고리즘 작성을 향해~
버블정렬, 선택정렬, 삽입정렬의 시간복잡도는 O(N²), 다만 삽입정렬의 경우 작은 루프에서 이미 정렬할 필요가 없을 경우 루프 자체를 돌지 않아도 되는 최선의 상태일 때는O(N)까지 가능
병합정렬의 시간복잡도는 O(Nlog2의N) — n/(2^k)=1 이므로 k = log2의N 만큼의 반복을 N회하니까 그럼
헤드노드 교체할 때, self.head = new_node 막빠로 해버리면 여태까지의 헤드노드들 전부 없어짐. new_node.next = self.head 한 뒤 self.head = new_node 식으로 해야 됨
Python의 // 연산자: 몫 표시 ex. 9 // 2 = 4
이분 탐색의 시간복잡도는 O(log 2의 N)
재귀함수 문제를 풀 때는 1. 반복하며 축소시키기 2. 예외 탈출구 만들기 에 주의할 것
배열의 길이를 N이라 할 때, 정렬의 시간복잡도는O( Nlog2의N), 집합화의 시간복잡도는 O(N)
함수 외부의 primitive 값을 파라미터로 쓸 때에는 global 변수명 하고 선언해줄 것
공간 복잡도: 입력값과 문제를 해결하는 데 걸리는 공간과의 상관관계
점근 표기법: 알고리즘의 효율성을 평가
1. Big-O 표기법: 최악의 성능이 나올 때의 연산량
2. Big-Ω 표기법: 최선의 성능이 나올 때의 연산량