# 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
```