# Techniques defaultdict 는 코드를 깔끔하게 만들어 준다 --- `from collections import defaultdict` 로 `defaultdict`를 사용하자. defaultdict는 key가 없는 값에 대해서 write 작업이 발생할 때, default 값으로 초기화시켜준다. 예를 들어, `defaultdict(int)` 로 하면 `a[key] +=1 ` 이라는 식이 가능해진다. `defaultdict(list)` 로 하면 `a[key].append(val)` 이라는 것도 가능해진다. 이 점에서 코드를 간결하게 작성할 수 있다. 조건이 있는 max/min/sum 함수 --- ```python= max([10,25,11,19], key= lambda x: x%10) ``` dict에서 value 가 가장 큰 key를 가져오기 --- ```python= max(a, key=a.get) ``` ~ 기능 (reverse) --- - logical not inverts all bits in a number, useful for traversing a list in reverse. ```python= def is_palindrome(s): return all([s[i] == s[~i] for i in range(len(s)//2)]) ``` - 참고로 palindrome 을 판별하는 방법은 reverse 한 값과 비교하면 되는 것이고, reverse 하는 방법은 `s[::-1]` 을 사용하는 방법도 있다. reverse traversing --- ```python= # Want to get a sequence from 7 to 0 for i in range(7, -1, -1): print(i) # alternative way of getting a sequence from 7 to 0 for i in reversed(range(0, 8)): print(i) ``` 한 줄에 변수 선언하기 --- ```python3= row, col = 0, 0 ``` 무한대, 무한소 값 설정하기 --- ```python= largest = float('inf') smallest = float('-inf') import math largest = math.inf smallest = -math.inf ``` deque 의 popleft() 를 쓰자 --- - 어떤 array의 가장 앞에 있는 데이터를 pop 할 때, 특히 Queue를 구현하는데, pop 을 할 필요가 있을 때, 그냥 array를 사용해서 pop(0)을 사용하는 것보다 `from collections import deque` 를 사용해서 `popleft()` 를 사용하는 것이 속도 개선에 더 용이하다. 왜냐하면 array의 pop(0) 은 $O(N)$ 의 시간복잡도를 필요로 하는데, deque의 popleft는 $O(1)$의 시간복잡도가 걸린다. 같은 레벨의 노드 BFS --- - DFS 의 경우 level을 저장할 필요가 있지만 같은 레벨의 노드를 방문할 때 BFS 는 level 을 저장할 필요가 없다. - 어떻게 하면 level 정보없이 같은 level에 있는지 알 수 있을까? ```python= # 초기값 q = [root] while q: # q 는 순서대로 들어가 있기 때문에 # pop 하지 않고 단순 for 문으로 # 같은 level에 있는 값들을 가져올 수 있다. for node in q: # do something # for the same level things # 그리고 나서 새로운 q 를 만들어준다 # left, right child 가 None 이어도 Queue에 추가해야하는 경우 q = [child for node in q for node in (node.child, node.right)] # left, right child 중에서 None 이 아니면 포함하면 안되는 경우 newq = [] for node in q: if node.left: newq.append(node.left) if node.right: newq.append(node.right) q = newq ```