๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ’ป๐Ÿ’ญ๐ŸŽง๐ŸŒ

DFS & BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

DFS & BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜

adorableco 2023. 1. 20. 16:00
๋ฐ˜์‘ํ˜•

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : DFS / BFS

ํƒ์ƒ‰(search) ์ด๋ž€? : ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •

- ๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” DFS์™€ BFS๊ฐ€ ์žˆ์Œ

- DFS/BFS๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ๋งค์šฐ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์œ ํ˜•

 

์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ

- ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์ค‘์— ๋‚˜๊ฐ€๋Š” ํ˜•์‹(์„ ์ž…ํ›„์ถœ)์˜ ์ž๋ฃŒ๊ตฌ์กฐ

- ์ž…๊ตฌ์™€ ์ถœ๊ตฌ๊ฐ€ ๋™์ผํ•œ ํ˜•ํƒœ๋กœ ์Šคํƒ์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ

- '์‚ฝ์ž…' ๊ณผ '์‚ญ์ œ' ๋‘ ์—ฐ์‚ฐ์œผ๋กœ ์ด๋ฃจ์–ด์ง

 

<์Šคํƒ ๊ตฌํ˜„ ์˜ˆ์ œ>

stack = []

#์‚ฝ์ž…(5) - ์‚ฝ์ž…(2) - ์‚ฝ์ž…(3) - ์‚ฝ์ž…(7) - ์‚ญ์ œ() - ์‚ฝ์ž…(1) - ์‚ฝ์ž…(4) - ์‚ญ์ œ()
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()

print(stack[::-1]) #์ตœ์ƒ๋‹จ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ
print(stack) # ์ตœํ•˜๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

→ append() ์™€ pop() ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1) ์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข‹์Œ

→ ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”์—†์ด ์Šคํƒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

 

ํ ์ž๋ฃŒ๊ตฌ์กฐ

- ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ํ˜•์‹(์„ ์ž…์„ ์ถœ)์˜ ์ž๋ฃŒ๊ตฌ์กฐ

- ํ๋Š” ์ž…๊ตฌ์™€ ์ถœ๊ตฌ๊ฐ€ ๋ชจ๋‘ ๋šซ๋ ค ์žˆ๋Š” ํ„ฐ๋„๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™” ํ•  ์ˆ˜ ์žˆ์Œ.

- ์ผ์ข…์˜ ๋Œ€๊ธฐ์—ด

 

<ํ ๊ตฌํ˜„ ์˜ˆ์ œ>

from collections import deque

# ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
queue = deque()

# ์‚ฝ์ž…(5) - ์‚ฝ์ž…(2) - ์‚ฝ์ž…(3) - ์‚ฝ์ž…(7) - ์‚ญ์ œ() - ์‚ฝ์ž…(1) - ์‚ฝ์ž…(4) - ์‚ญ์ œ()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()

print(queue) # ๋จผ์ € ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ
queue.reverse() # ์—ญ์ˆœ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
print(queue) # ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

- ํ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋‚ฎ์•„ ์ข‹์Œ.

- ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋“ค์–ด์™€ ์™ผ์ชฝ์„ ๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ

 

 

์žฌ๊ท€ ํ•จ์ˆ˜(Recursive Function)๋ž€? ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜

- ํ์™€ ์œ ์‚ฌํ•จ

 

<์žฌ๊ท€ ํ•จ์ˆ˜ ์˜ˆ์ œ>

def recursive_function():
	print('์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.')
    recursive_function()

recursive_function()

 - ํŒŒ์ด์ฌ์€ ์žฌ๊ท€ ๊นŠ์ด ์ œํ•œ์„ ๋‘์ง€ ์•Š์œผ๋ฉด error (์ตœ๋Œ€ ์žฌ๊ท€ ๊นŠ์ด ์ดˆ๊ณผ ๋ฉ”์‹œ์ง€) ๋ฐœ์ƒ

 

 

<์ข…๋ฃŒ ์กฐ๊ฑด์„ ํฌํ•จํ•œ ์žฌ๊ท€ ํ•จ์ˆ˜ ์˜ˆ์ œ>

def recursive_function(i):
	#100๋ฒˆ์งธ ํ˜ธ์ถœ์„ ํ–ˆ์„ ๋•Œ ์ข…๋ฃŒ๋˜๋„๋ก ์ข…๋ฃŒ ์กฐ๊ฑด ๋ช…์‹œ
    if i == 100:
    	return
    print(i,'๋ฒˆ์งธ ์žฌ๊ท€ํ•จ์ˆ˜์—์„œ', i+1, '๋ฒˆ์งธ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.')
    recursive_function(i+1)
    print(i,'๋ฒˆ์งธ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.')

recursive_function(1)

- ์˜๋„ํ•ด์„œ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฌธ์ œ ํ’€์ด์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•จ.

 

 

<ํŒฉํ† ๋ฆฌ์–ผ ๊ตฌํ˜„ ์˜ˆ์ œ>

#๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_iterative(n):
	result = 1
    # 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ณฑํ•˜๊ธฐ
    for i in range(1, i+1):
    	result *= i
        return result

# ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_recursive(n):
	if n<=1: # n์ด 1 ์ดํ•˜์ธ ๊ฒฝ์šฐ 1์„ ๋ฐ˜ํ™˜
    	return 1
    # n! = n * (n-1)! ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ
    return n * factorial_recursive(n-1)

# ๊ฐ๊ฐ์˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ n! ์ถœ๋ ฅ(n=5)
print('๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„:',factorial_iterative(5))
print('์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„:',factorial_recursice(5))

 

<์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ณ„์‚ฐ(์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•) ์˜ˆ์ œ>

  • ๋‘ ์ž์—ฐ์ˆ˜ A,B์— ๋Œ€ํ•˜์—ฌ (A>B) A๋ฅผ B๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ R์ด๋ผ๊ณ  ํ•˜์ž.
  • ์ด๋•Œ A์™€ B์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋Š” B์™€ R์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์™€ ๊ฐ™๋‹ค.
def gcd(a, b):
	if a%b == 0:
    	return b
    else:
    	return gcd(b, a%b)

print(gcd(192,162))

→ a์™€ b์˜ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ๋ณ€์ˆ˜์— ๋„ฃ์œผ๋ฉด ๋จ

 

โ€ป ์œ ์˜ ์‚ฌํ•ญ

 

- ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

- ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ํ˜•ํƒœ์˜ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Œ

- ๋ชจ๋“  ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

- ์ปดํ“จํ„ฐ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ž„ → ๊ทธ๋ž˜์„œ ์Šคํƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹  ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

 

 


DFS (Depth-First Search)

- DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฆ„

- DFS๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ (or ์žฌ๊ท€ ํ•จ์ˆ˜)๋ฅผ ์ด์šฉํ•จ.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  3. ๋” ์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

<DFS ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ>

#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 (Breadth-First Search)

- BFS๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฆ„

- BFS๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•จ

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ ๋’ค์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. ๋” ์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

→ ๊ฐ ๊ฐ„์„ ์˜ ๋น„์šฉ์ด ๋ชจ๋‘ ๋™์ผํ•œ ์ƒํ™ฉ์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•จ

 

 

<BFS ์†Œ์Šค์ฝ”๋“œ ์˜ˆ์ œ>

from collections import deque

# BFS ๋ฉ”์†Œ๋“œ ์ •์˜
def bfs(graph, start, visited):
	# ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด 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

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

 

<๋ฌธ์ œ1> ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

  • N x M ํฌ๊ธฐ์˜ ์–ผ์Œ ํ‹€์ด ์žˆ๋‹ค. ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„์€ 0, ์นธ๋ง‰์ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋œ๋‹ค. ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„๋ผ๋ฆฌ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ๋ถ™์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ์ด๋•Œ ์–ผ์Œ ํ‹€์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์ด ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. ๋‹ค์Œ์˜ 4 x 5 ์–ผ์Œ ํ‹€ ์˜ˆ์‹œ์—์„œ๋Š” ์•„์ด์Šคํฌ๋ฆผ์ด ์ด 3๊ฐœ ์ƒ์„ฑ๋œ๋‹ค.
    • 00110
    • 00010
    • 11111
    • 00000
    •  

<๋ฌธ์ œ ํ•ด๊ฒฐ>

  • ํŠน์ •ํ•œ ์ง€์ ์˜ ์ฃผ๋ณ€ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋ฅผ ์‚ดํŽด๋ณธ ๋’ค์— ์ฃผ๋ณ€ ์ง€์  ์ค‘์—์„œ ๊ฐ’์ด '0'์ด๋ฉด์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ง€์ ์„ ๋ฐฉ๋ฌธํ•œ๋‹ค.
  • ๋ฐฉ๋ฌธํ•œ ์ง€์ ์—์„œ ๋‹ค์‹œ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ฐฉ๋ฌธ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ง€์ ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ 1~2๋ฒˆ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์˜ ์ˆ˜๋ฅผ ์นด์šดํŠธํ•œ๋‹ค.

 

<์ฝ”๋“œ>

#DFS๋กœ ํŠน์ • ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๋„ ๋ฐฉ๋ฌธ
def dfs(x, y):
    # ์ฃผ์–ด์ง„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ
    if x<= -1 or x>=n or y<=-1 or y>=m:
        return False
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
    if graph[x][y] == 0:
        #ํ•ด๋‹น ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        graph[x][y] = 1
        #์ƒ, ํ•˜, ์ขŒ, ์šฐ์˜ ์œ„์น˜๋“ค๋„ ๋ชจ๋‘ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
        dfs(x-1,y)
        dfs(x,y-1)
        dfs(x+1,y)
        dfs(x,y+1)
        return True
    return False

# N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
n, m = map(int, input.split())

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
graph = []
for i in range(n):
    graph.append(list(map(int, input())))

# ๋ชจ๋“  ๋…ธ๋“œ(์œ„์น˜)์— ๋Œ€ํ•˜์—ฌ ์Œ๋ฃŒ์ˆ˜ ์ฑ„์šฐ๊ธฐ
result = 0
for i in range(n):
    for j in range(m):
        # ํ˜„์žฌ ์œ„์น˜์—์„œ DFS ์ˆ˜ํ–‰
        if dfs(i,j) == True:
            result += 1

print(result)

 

 

 

<๋ฌธ์ œ 2> ๋ฏธ๋กœ ํƒˆ์ถœ

  • ๋™๋นˆ์ด๋Š” N x M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜”๋‹ค. ๋ฏธ๋กœ์—๋Š” ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์˜ ๊ดด๋ฌผ์ด ์žˆ์–ด ์ด๋ฅผ ํ”ผํ•ด ํƒˆ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • ๋™๋นˆ์ด์˜ ์œ„์น˜๋Š” (1,1)์ด๋ฉฐ ๋ฏธ๋กœ์˜ ์ถœ๊ตฌ๋Š” (N,M)์˜ ์œ„์น˜์— ์กด์žฌํ•˜๋ฉฐ ํ•œ ๋ฒˆ์— ํ•œ ์นธ์”ฉ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๊ดด๋ฌผ์ด ์žˆ๋Š” ๋ถ€๋ถ„์€ 0์œผ๋กœ, ๊ดด๋ฌผ์ด ์—†๋Š” ๋ถ€๋ถ„์€ 1๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” ๋ฐ˜๋“œ์‹œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ œ์‹œ๋œ๋‹ค.
  • ์ด๋•Œ ๋™๋นˆ์ด๊ฐ€ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์›€์ง์—ฌ์•ผ ํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ. ์นธ์„ ์…€ ๋•Œ๋Š” ์‹œ์ž‘ ์นธ๊ณผ ๋งˆ์ง€๋ง‰ ์นธ์„ ๋ชจ๋‘ ํฌํ•จํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค.

 

<๋ฌธ์ œ ํ•ด๊ฒฐ>

  • BFS๋Š” ์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  • ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋กœ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ 1๋กœ ๋™์ผํ•˜๋‹ค.
    • ๋”ฐ๋ผ์„œ (1,1) ์ง€์ ๋ถ€ํ„ฐ BFS๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ฐ’์„ ๊ธฐ๋กํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

<์ฝ”๋“œ>

# BFS ์†Œ์Šค์ฝ”๋“œ ๊ตฌํ˜„
def bfs(x, y):
    # ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    queue = deque()
    queue.append((x,y))
    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ธฐ
    while queue:
        x, y = queue.popleft()
        # ํ˜„์žฌ ์œ„์น˜์—์„œ 4๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์œ„์น˜ ํ™•์ธ
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # ๋ฏธ๋กœ ์ฐพ๊ธฐ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฌด์‹œ
            if nx < 0 or nx >= n or ny < 0 or ny >= m:
                continue
            # ๋ฒฝ์ธ ๊ฒฝ์šฐ ๋ฌด์‹œ
            if graph[nx][ny] == 0:
                continue
            # ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx,ny))
        # ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜
        return graph[n-1][m-1]

from collections import deque

# N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
n, m = map(int, inpit().split())
# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
graph = []
for i in range(n):
    graph.append(list(map(int, input())))

# ์ด๋™ํ•  ๋„ค๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ •์˜ (์ƒ, ํ•˜, ์ขŒ, ์šฐ)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print(bfs(0,0))

graph[nx][ny] = graph[x][y] + 1 : ํ˜„์žฌ๊นŒ์ง€ ๊ธฐ๋ก๋œ ๊ทธ๋ž˜ํ”„์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ graph[nx][ny] ์— ์ง‘์–ด ๋„ฃ์Œ

 

๋ฐ˜์‘ํ˜•