# defaultdict

defaultdict는 collections 모듈에 속해 있다. 

```
from collections import defaultdict
```

그렇기에 위 코드를 위에 선언해야한다.

defaultdict를 사용하면 기본값을 설정할 수 있어서 키가 존재하지 않는 경우도 key error를 발생시키지 않고 기본값을 반환할 수 있다. 

defaultditct에는 int, list, set를 사용할수 있는데 하나하나 어떤 기능을 하는지 확인해보자.

- defaultdict(int) 

밸류값을 0으로 초기화 한다.

```
from collections import defaultdict

# 기본값이 0인 defaultdict 생성
d = defaultdict(int)

# 값 추가
d['apple'] += 1
d['banana'] += 1
d['apple'] += 1

print(d)
# 출력: defaultdict(<class 'int'>, {'apple': 2, 'banana': 1})
```

- defaultdict(list)

빈 리스트를 값으로 가지는 딕셔너리를 쉽게 생성할 수 있다.

```
from collections import defaultdict

# 기본값이 빈 리스트인 defaultdict 생성
d = defaultdict(list)

# 값 추가
d['fruits'].append('apple')
d['fruits'].append('banana')
d['vegetables'].append('carrot')

print(d)
# 출력: defaultdict(<class 'list'>, 
  {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']})
```

- defaultdict(set)

빈 집합을 값으로 가지는 딕셔너리를 쉽게 생성할 수 있다.

```
from collections import defaultdict

# 기본값이 빈 집합인 defaultdict 생성
d = defaultdict(set)

# 값 추가
d['fruits'].add('apple')
d['fruits'].add('banana')
d['fruits'].add('apple')  # 집합이므로 중복된 값은 한 번만 저장됨

print(d)
# 출력: defaultdict(<class 'set'>, {'fruits': {'banana', 'apple'}})
```

백준 문제를 풀다 보면 for 반복문을 사용해 빈 리스트나 세트를 만드는 경우가 많다.
이때 defaultdict를 사용하면 코드를 한눈에 보기도 쉽고 시간복잡도에서 이점을 가져갈 수 있다.

for _ in range(int(input())):
    n, m = map(int, input().split())
    graph = {i: [] for i in range(1, n + 1)}
    for _ in range(m):
        a, b = map(int, input().split())
        graph[a].append(b)
        graph[b].append(a)
    cnt = dfs(1,[])
    print(cnt)

for _ in range(int(input())):
    n, m = map(int, input().split())
    graph = defaultdict(list)
    for _ in range(m):
        a, b = map(int, input().split())
        graph[a].append(b)
        graph[b].append(a)
    cnt = dfs(1,[])
    print(cnt)

For the site tree, see the [root Markdown](https://slashpage.com/kyugntae-ai.md).
