๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ ๊ธฐ๋ก

[DFS/BFS : python] ์ด์ฝ”ํ…Œ ๋‚ด์šฉ ์ •๋ฆฌ ๋ฐ ๋ฌธ์ œ ํ’€์ด ๊ธฐ๋ก

by hyeonha 2024. 4. 6.

* ์ด์ฝ”ํ…Œ ํŒŒ์ด์ฌ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

ํƒ์ƒ‰์ด๋ž€?

๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •
๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— DFS์™€ BFS๊ฐ€ ์žˆ๋‹ค. ๋งค์šฐ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์œ ํ˜•์ด๋ผ์„œ ๊ผญ ์ˆ™์ง€ํ•˜๋„๋ก ํ•˜์ž!
 

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

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

์—ฐ์‚ฐ

 
1๏ธโƒฃ์Šคํƒ์„ ํŒŒ์ด์ฌ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŒŒ์ด์ฌ์—์„œ์˜ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

stack = []

 

2๏ธโƒฃ์—ฐ์‚ฐ

๋ฆฌ์ŠคํŠธ์˜ append ์—ฐ์‚ฐ๊ณผ pop์—ฐ์‚ฐ์„ ํ†ตํ•ด ์Šคํƒ์˜ ์‚ฝ์ž… ์‚ญ์ œ ์—ฐ์‚ฐ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
์‚ฝ์ž… : append()
์‚ญ์ œ : pop()
 
์ถœ๋ ฅ ํ˜•ํƒœ
- ์ตœ์ƒ๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ : ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

print(stack[::-1])


- ์ตœํ•˜๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ  : ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ 

print(stack)


์•Œ์•„์•ผํ•  ์ž๋ฃŒ๊ตฌ์กฐ :  ํ

ํ๋Š” ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” FIFO ํ˜•์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. 
 

 
 
 ํŒŒ์ด์ฌ์—์„œ ํ ๊ตฌํ˜„ํ•˜๊ธฐ

from collections import deque

 

ํŒŒ์ด์ฌ์—์„œ ํ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋” ๋†’์•„ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.

 

1๏ธโƒฃ ํ๋Š” deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ค€๋‹ค.

queue = deque()

 

2๏ธโƒฃ์—ฐ์‚ฐ

- ์‚ฝ์ž… : append( )

- ์‚ญ์ œ : popleft()

 

๊ทธ๋ฆผ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋“ค์–ด์™€์„œ ์™ผ์ชฝ์œผ๋กœ ๋‚˜๊ฐ„๋‹ค! 

3๏ธโƒฃ์ถœ๋ ฅ

- ๋จผ์ € ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ 

print(queue)

 

- ์—ญ์ˆœ์œผ๋กœ ๋ฐ”๊พผ ํ›„ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

queue.reverse()
print(queue)

 

์žฌ๊ท€ํ•จ์ˆ˜(Recursive Function)

 ์žฌ๊ท€ํ•จ์ˆ˜๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋กœ DFS๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‹ค์งˆ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

ํŒŒ์ด์ฌ์—์„œ๋Š” ์ตœ๋Œ€ ์žฌ๊ท€ ํ˜ธ์ถœ ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค.

 

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

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

 

์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋ช…์‹œํ•ด์„œ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

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

 

์žฌ๊ท€ํ•จ์ˆ˜ ์˜ˆ์ œ : ํŒฉํ† ๋ฆฌ์–ผ ๊ตฌํ˜„ ์˜ˆ์ œ

- n! = 1 * 2 * 3 * ``` * (n-1) * n

- 0!์™€ 1!์˜ ๊ฐ’์€ 1์ด๋‹ค.

 

- ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!

def factorial_iterative(n):
	result = 1
    for i in range(1,n+1):
    	result *= i
    return result

 

 

- ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!

def factorial_recursive(n):
	if n<=1:
    	return 1
    return n* factorial_recursice(n-1)

 

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

- ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

- ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•

   - ๋‘ ์ž์—ฐ์ˆ˜ 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))

 

์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉ์˜ ์œ ์˜ ์‚ฌํ•ญ

1๏ธโƒฃ๋ชจ๋“  ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„๋œ ๊ฒƒ์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

2๏ธโƒฃ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต๋ฌธ๋ณด๋‹ค ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  ๋ถˆ๋ฆฌํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ์— ๋งž๋Š” ํ˜•ํƒœ๋ฅผ ๊ณ ๋ คํ•ด์„œ ํ’€์–ด์•ผํ•œ๋‹ค.

3๏ธโƒฃ ์ปดํ“จํ„ฐ๊ฐ€ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์Œ“์ธ๋‹ค.

๊ทธ๋ž˜์„œ ์Šคํƒ์„ ์‚ฌ์šฉํ•ด์•ผํ•  ๋•Œ ๊ตฌํ˜„ ์ƒ ์Šคํƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹ ์— ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 

DFS(Depth-First Search)

DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

๊ตฌํ˜„

DFS๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์—๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋‚˜ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.


๋™์ž‘ ๊ณผ์ •

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

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

3๏ธโƒฃ๋”์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

 

step1. ์‹œ์ž‘ ๋…ธ๋“œ์ธ 1์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

step2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 1์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ  2,3,8์ด ์žˆ๋‹ค.

- ์ด ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ธ 2๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

step3 : ์ด์ œ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋Š 2๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค. ์ด์ œ 2๋ฅผ ๊ธฐ์ค€์œผ๋กœ DFS๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 2์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 7์ด ์žˆ๋‹ค.

- ๋”ฐ๋ผ์„œ 7๋ฒˆ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

 

step 4 : ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 7์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 6,8์ด ์žˆ๋‹ค.

- ์ด ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ธ 6์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

 

step 5 : ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 6์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค. 

- ๋”ฐ๋ผ์„œ ์Šคํƒ์—์„œ 6๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.

 

step 6 : ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 7์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 8์ด ์žˆ๋‹ค.

- ๋”ฐ๋ผ์„œ 8๋ฒˆ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

์ด ๊ณผ์ •์„ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ์ „์ฒด ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ(์Šคํƒ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)๋Š” 

 

ํƒ์ƒ‰ ์ˆœ์„œ : 1 -> 2-> 7 -> 6 -> 8 -> 3 -> 4 -> 5 ์ด๋‹ค.

 

DFS ๊ตฌํ˜„ ์ฝ”๋“œ ์•Œ์•„๋ณด๊ธฐ

1๏ธโƒฃ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„ : ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ (2์ฐจ์› ๋ฆฌ์ŠคํŠธ)

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„

0๋ฒˆ์€ ๋น„์›Œ๋‘”๋‹ค.

graph = [
	[],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]

 

2๏ธโƒฃ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ 1์ฐจ์› ๋ฆฌ์ŠคํŠธ 


๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฐ’์€ False ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.

์ด ๋•Œ ์ธ๋ฑ์Šค 0์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ 0๋ถ€ํ„ฐ 8๊นŒ์ง€ 9

visited = [False] * 9

 

3๏ธโƒฃ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)

 

BFS (Breadth-First Search)

BFS๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

BFS๋Š” ํ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ด์š”ํ•œ๋‹ค.

 

๋™์ž‘ ๊ณผ์ •

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

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

3๏ธโƒฃ๋”์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

BFS ๋™์ž‘ ์˜ˆ์‹œ ์•Œ์•„๋ณด๊ธฐ

step 0 : ๊ทธ๋ž˜ํ”„๋ฅผ ์ค€๋น„ํ•œ๋‹ค. ( ๋ฐฉ๋ฌธ ๊ธฐ์ค€์€ ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ธ์ ‘๋…ธ๋“œ๋ถ€ํ„ฐ)

์‹œ์ž‘ ๋…ธ๋“œ๋Š” 1์ด๋‹ค.

 

step 1 : ์‹œ์ž‘ ๋…ธ๋“œ์ธ 1์„ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

step 2 : ํ์—์„œ ๋…ธ๋“œ 1์„ ๊บผ๋‚ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 2, 3, 8์„ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

step 3: ํ์—์„œ ๋…ธ๋“œ 2๋ฅผ ๊บผ๋‚ด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 7์„ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

step 4: ํ์—์„œ ๋…ธ๋“œ 3์„ ๊บผ๋‚ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 4, 5,๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

step 5 : ํ์—์„œ ๋…ธ๋“œ 8์„ ๊บผ๋‚ด๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฌด์‹œํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ „์ฒด ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ(ํ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)๋Š” 

ํƒ์ƒ‰ ์ˆœ์„œ : 1 -> 2-> 3- > 8-> 7 -> 4 -> 5 -> 6

 

๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ๋…ธ๋“œ 2, 3, 8

๊ฑฐ๋ฆฌ๊ฐ€ 2์ธ ๋…ธ๋“œ 7, 4, 5 

๊ฑฐ๋ฆฌ๊ฐ€ 3์ธ ๋…ธ๋“œ 6

 

BFS ๊ตฌํ˜„ ์ฝ”๋“œ ์•Œ์•„๋ณด๊ธฐ

1๏ธโƒฃํ๋ฅผ ์œ„ํ•ด์„œ deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

from collections import deque

 

2๏ธโƒฃ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„ : ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ (2์ฐจ์› ๋ฆฌ์ŠคํŠธ)


๋…ธ๋“œ๊ฐ€ 1๋ฒˆ๋ถ€ํ„ฐ 8๋ฒˆ๊นŒ์ง€ 8๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— 0 ์ธ๋ฑ์Šค๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 

graph = [
	[],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]

 

3๏ธโƒฃ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

visited = [False] * 9

 

4๏ธโƒฃ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

 

 

๐Ÿฆ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

# ์ž…๋ ฅ ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜
n, m = map(int,input().split())
graph = []

# ๊ทธ๋ž˜ํ”„ ์ž…๋ ฅ ๋ฐ›๊ธฐ
for i in range(n):
  graph.append(list(map(int,input())))


# 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+1,y)
    dfs(x,y-1)
    dfs(x,y+1)
    return True
  return False

icecream = 0

for i in range(n):
  for j in range(m):
    if dfs(i,j)==True:
      icecream+=1

print(icecream)

 

๐Ÿ˜ญ์–ด๋ ค์› ๋˜ ์ 

๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์ด ๋ฌธ์ œ๋Š” dfs๋กœ ํ’€๋ฉด ๋˜๊ฒ ๋‹ค! ํ•˜๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค. ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๊ณ  ์‚ฌ๊ณ  ํ๋ฆ„์„ ์ •๋ฆฝํ•ด์•ผ๊ฒ ๋‹ค


๋ฏธ๋กœํƒˆ์ถœ ๋ฌธ์ œ 

์ฒ˜์Œ์—๋Š” ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ฉด ๋˜๋‹ˆ๊นŒ DFS๋ฅผ ํ†ตํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€๋ ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ DFS๋ฅผ ํ†ตํ•ด์„œ๋Š” ์ตœ์†Œ ์ด๋™ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰ํ•˜๋Š” BFS๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

์ฒ˜์Œ ์ž˜๋ชป ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

n,m = map(int,input().split())

# ๊ทธ๋ž˜ํ”„ ์ž…๋ ฅ
graph =[]

for _ in range(n):
  graph.append(list(map(int,input())))

global count 
count = 1

def dfs(x,y):
  if x<0 or x>n-1 or y<0 or y>m-1:
    return False
  
  if graph[x][y] ==1:
    graph[x][y] =0
    dfs(x+1,y)
    dfs(x,y+1)
    dfs(x-1,y)
    dfs(x,y-1)
    return True
  return False

for i in range(n):
  for j in range(m):
    if dfs(i,j)==True:
      count+=1
    
print(count)

 

BFS ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ 

BFS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ดด๋ฌผ์ด ์—†๋Š” 1 ๋…ธ๋“œ๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด์„œ, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

from collections import deque

n,m = map(int,input().split())

# ๊ทธ๋ž˜ํ”„ ์ž…๋ ฅ
graph =[]

for _ in range(n):
  graph.append(list(map(int,input())))

# ์ƒ ํ•˜ ์ขŒ์šฐ ์ด๋™ ์‹œ ์œ„์น˜ ๋ณ€ํ™”
dx = [-1,1,0,0]
dy = [0,0,-1,1]

def bfs(x,y):
  queue = deque()
  
  queue.append((x,y))
  while queue:
    x,y = queue.popleft()
    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[x][y] ==0:
        continue

      # ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก  
      # ๋”ฐ๋กœ count๋ฅผ ํ•ด์ค„ ํ•„์š” ์—†์ด +1 ํ•ด์ฃผ๋ฉด ๋„์ฐฉํ–ˆ์„ ๋•Œ ์ด๋™ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
      if graph[nx][ny] == 1:
        graph[nx][ny] = graph[x][y] +1
        queue.append((nx,ny))
  return graph[n-1][m-1]

print(bfs(0,0))

 

728x90