suvera-dev ๐Ÿฅฆ

Algorithm) DFS/BFS ๋ณธ๋ฌธ

Algorithm/CodingTest - Python

Algorithm) DFS/BFS

suvera 2022. 4. 2. 01:17

๐Ÿž DFS 

- ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

- ๊ทธ๋ž˜ํ”„์˜ ๊ธฐ๋ณธ๊ตฌ์กฐ๋ฅผ ์•Œ์•„์•ผํ•จ โฌ‡๏ธ

๋”๋ณด๊ธฐ

๐Ÿ”– ๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ์™€ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„๋˜๋ฉฐ ์ด๋•Œ ๋…ธ๋“œ๋ฅผ ์ •์ ์ด๋ผ๊ณ ๋„ ๋งํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด๋ž€ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋˜ํ•œ ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋‘ ๋…ธ๋“œ๋Š” ์ธ์ ‘ํ•˜๋‹ค ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค

- ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ทธ๋ž˜ํ”„๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ด ๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ํ•„์š”ํ•˜๋‹ˆ ๋‘ ๊ฐœ๋…์— ๋Œ€ํ•ด ๋ฐ”๋ฅด๊ฒŒ ์•Œ๊ณ  ์žˆ๋„๋ก ํ•˜์ž !

 

1. ์ธ์ ‘ํ–‰๋ ฌ : 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹

- 2์ฐจ์› ๋ฐฐ์—ด์— ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹ 

- ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ํŒŒ์ด์ฌ์—์„œ๋Š” 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฆฌ๋Š” ๋ฌดํ•œ์˜ ๋น„์šฉ์ด๋ผ๊ณ  ์ž‘์„ฑํ•œ๋‹ค. ์‹ค์ œ ์ฝ”๋“œ์—์„œ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ •๋‹ต์ด ๋  ์ˆ˜ ์—†๋Š” ํฐ ๊ฐ’ ์ค‘์—์„œ 999999999, 987654321 ๋“ฑ์˜ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. 

INF = 9999999999 # ๋ฌดํ•œ์˜ ๋น„์šฉ ์„ ์–ธ

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ์ธ์ ‘ ํ–‰๋ ฌ ํ‘œํ˜„
graph = [
	[0,7,5],
    [7,0,INF],
    [5,INF,0]
]

print(graph)

2. ์ธ์ ‘๋ฆฌ์ŠคํŠธ : ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹ 

- ๋ชจ๋“  ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ €์žฅ

- ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•œ๋‹ค. 

- ํŒŒ์ด์ฌ์—์„œ๋Š” ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ธ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์ด append()์™€ ๋ฉ”์†Œ๋“œ ์ œ๊ณต

- ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•  ๋•Œ๋„ ๋‹จ์ˆœํžˆ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ ์ด์šฉ !

# ํ–‰(Row)์ด 3๊ฐœ์ธ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„
graph = [[] for _ in range(3)]

# ๋…ธ๋“œ 0์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[0].append((1,7))
graph[0].append((2,5))

# ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[1].append((0,7))

# ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[2].append((0.5))

print(graph)

=> ์ด ๋‘ ๋ฐฉ์‹์€ ์–ด๋–ค ์ฐจ์ด์ผ๊นŒ์š”? ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์™€ ์†๋„ ์ธก๋ฉด์—์„œ ์‚ดํŽด๋ณด์ž ! 

1. ๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด :

์ธ์ ‘ํ–‰๋ ฌ ๋ฐฉ์‹์€ ๋ชจ๋“  ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ญ๋น„๋œ๋‹ค. 

์ธ์ ‘๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 

2. ์†๋„ ์ธก๋ฉด :  

๋ฐ˜๋ฉด ์†๋„ ์ธก๋ฉด์—์„œ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์€ ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์— ๋น„ํ•ด ํŠน์ •ํ•œ ๋‘ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. 

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์—์„œ๋Š” ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

ex) ๋…ธ๋“œ 1๊ณผ ๋…ธ๋“œ 7์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋–„, ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์—์„œ๋Š” graph[1][7]๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค. ๋ฐ˜๋ฉด์— ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์—์„œ๋Š” ๋…ธ๋“œ 1์— ๋Œ€ํ•œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠน์ •ํ•œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์ด ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๊ฐ€ ์ ๋‹ค. 

 


DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ !

- ํŠน์ •ํ•œ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํŠน์ •ํ•œ ์ƒํ™ฉ์—์„œ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

- ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉ !

1) ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. 

2) ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค. 

3) 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณต ํ•œ๋‹ค

# ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์œผ๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ˆœ์„œ ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

# ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ N๊ฐœ์ธ ๊ฒฝ์šฐ O(N)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. 

 

#DFS ๋ฉ”์„œ๋“œ ์ •์˜
def dfs(graph, v, visited):
    # ํ˜„์žฌ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
    visited[v] = True
    print(v, end= ' ')
    # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)
            
# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False] * 9 

# ์ •์˜๋œ dfs ํ•จ์ˆ˜ ํ˜ธ์ถœ 
dfs(graph, 1, visited)

 

 


BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ! 

- ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

- ์„ ์ž…์„ ์ถœ ๋ฐฉ์‹์ธ ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉ

- ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ์— ๋„ฃ๋„๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋จผ์ € ๋“ค์–ด์˜จ ๊ฒƒ์ด ๋‚˜๊ฐ€๊ฒŒ ๋˜์–ด, ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ ์ง„ํ–‰ ! 

1) ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ 

2) ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ

3) 2๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค 

- deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ, ์‹ค์ œ ์ˆ˜ํ–‰์‹œ๊ฐ„์€ DFS ๋ณด๋‹ค ์ข‹์€ ํŽธ !

from collections import deque

# BFS ๋ฉ”์„œ๋“œ ์ •์˜
def bfs(graph, start, visited):
    # ํ ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    queue = deque([start])
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[start] = True
    # ํ๊ฐ€ ๋นŒ ๋–„ ๊นŒ์ง€ ๋ฐ˜๋ณต 
    while queue: 
        # ํ์—์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ๋ฝ‘์•„ ์ถœ๋ ฅ 
        v = queue.popleft()
        print(v, end=' ')
        # ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์›์†Œ๋“ค์„ ํ์— ์‚ฝ์ž… 
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„ - 2์ฐจ์› ๋ฆฌ์ŠคํŠธ 
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False] * 9

# ์ •์˜๋œ dfs ํ•จ์ˆ˜ ํ˜ธ์ถœ
bfs(graph, 1, visited)

 

 


 

โœจ ์ด๋ ‡๊ฒŒ DFS์™€ BFS์˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋Š”๋ฐ, ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜์ž๋ฉด

  DFS BFS
 ๋™์ž‘ ์›๋ฆฌ  ์Šคํƒ  ํ
๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์žฌ๊ท€ ํ•จ์ˆ˜ ์ด์šฉ  ํ ์ž๋ฃŒ๊ตฌ์กฐ ์ด์šฉ

์ด๋ ‡๋‹ค ! ๋˜ํ•œ, 1์ฐจ์› ๋ฐฐ์—ด์ด๋‚˜ 2์ฐจ์› ๋ฐฐ์—ด์„ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ˆ˜์›”ํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€์ˆ˜ ์žˆ๋‹ค. 

2์ฐจ์› ๋ฐฐ์—ด์—์„œ์˜ ํƒ์ƒ‰๋ฌธ์ œ๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด, ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์„œ ์ƒ๊ฐํ•˜๋ฉด ํ’€์ด ๋ฐฉ๋ฒ•์„ ์ข€ ๋” ์‹ญ๊ฒŒ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. 

 

Comments