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

[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