[๐Ÿ“š์ด์ฝ”ํ…Œ #1] DFS/BFS ๐Ÿ”ฅ

์ตœํ˜ธ๋นˆยท2023๋…„ 4์›” 25์ผ
0
post-thumbnail

์ถœ์ฒ˜ : https://www.youtube.com/watch?v=7C9RgOcvkvo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3


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

  • ํƒ์ƒ‰(Search)์ด๋ž€ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •
  • ๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” DFS์™€ BFS๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DFS/BFS๋Š” ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ๋งค์šฐ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์œ ํ˜•์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์ˆ™์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

โœ๏ธ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ

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

ํ”„๋ง๊ธ€์Šค ํ†ต์— ํ”„๋ง๊ธ€์Šค ๋„ฃ๊ธฐ ๐Ÿช ๊ฐ™์€ ๋Š๋‚Œ

python

stack = []	# ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ์‚ฌ์šฉ

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

# append(), pop()์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()

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

Java

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Stack<Integer> s = new Stack<>();
		//์‚ฝ์ž…(5) - ์‚ฝ์ž…(2) - ์‚ฝ์ž…(3) - ์‚ฝ์ž…(7) - ์‚ญ์ œ() - ์‚ฝ์ž…(1) - ์‚ฝ์ž…(4) - ์‚ญ์ œ()
		s.push(5); 
        s.push(2); 
        s.push(3); 
        s.push(7); 		
        s.pop();
		s.push(1); 
        s.push(4);
		s.pop();

		//์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ
		while(!s.empty()) {
			System.out.print(s.peek() + " ");
			s.pop ();
        }
    }
}

โœ๏ธ ํ ์ž๋ฃŒ๊ตฌ์กฐ

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

์ž…๊ตฌ์™€ ์ถœ๊ตฌ๊ฐ€ ๋ชจ๋‘ ๋šซ๋ ค ์žˆ๋Š” ํ„ฐ๋„๊ณผ ๊ฐ™์€ ํ˜•ํƒœ ๐Ÿ’จ
์˜ˆ์‹œ ) ์€ํ–‰์ฐฝ๊ตฌ์—์„œ ๋ฒˆํ˜ธํ‘œ ๋ฝ‘๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ธฐ


python

# ๋ฆฌ์ŠคํŠธ๋กœ ํ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋†’์•„ ๋น„ํšจ์œจ์ 
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) # ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

Java

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Queue<Integer> q = new LinkedList<>();

		// ์‚ฝ์ž…(5) - ์‚ฝ์ž…(2) - ์‚ฝ์ž…(3) - ์‚ฝ์ž…(7) - ์‚ญ์ œ() - ์‚ฝ์ž…(1) - ์‚ฝ์ž…(4) - ์‚ญ์ œ ()
		q.offer(5); 
        q.offer(2); 
        q.offer(3); 
        q.offer(7);
		q.poll();
		q.offer(1); 
        q.offer(4); 
        q.poll();

        // ๋จผ์ € ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถ”์ถœ
		while (!q.isEmpty()) {
			System.out.print(q.poll() + " ");
		}
	}
}

โœ๏ธ ์žฌ๊ท€ํ•จ์ˆ˜

  • ์žฌ๊ท€ ํ•จ์ˆ˜(Recursive Function)๋ž€ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜
  • ๋ชจ๋“  ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

1๏ธโƒฃ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ ์žฌ๊ท€ ํ•จ์ˆ˜ ์˜ˆ์ œ

  • '์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.' ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฌดํ•œํžˆ ์ถœ๋ ฅ
def recursive function():
	print('์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.')
	recursive_function ()
recursive function()
  • ์–ด๋Š ์ •๋„ ์ถœ๋ ฅํ•˜๋‹ค๊ฐ€ ์ตœ๋Œ€ ์žฌ๊ท€ ๊นŠ์ด ์ดˆ๊ณผ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

2๏ธโƒฃ ํŒฉํ† ๋ฆฌ์–ผ๋กœ ๊ตฌํ˜„ํ•œ ์žฌ๊ท€ํ•จ์ˆ˜ ์˜ˆ์ œ

  • n! = 1 x 2 x 3 x ... x (n-1) x n
  • 0!๊ณผ 1!์€ 1์ด๋‹ค
# ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_iterative(n):
	result = 1
	# 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ณฑํ•˜๊ธฐ
	for i in range (1, n + 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_recursive(5))

3๏ธโƒฃ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ณ„์‚ฐ(์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•) ์˜ˆ์ œ

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

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

  • ๋‘ ์ž์—ฐ์ˆ˜ A, B์— ๋Œ€ํ•˜์—ฌ (A > B) A๋ฅผ B๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ R์ด๋ผ๊ณ  ํ•˜์ž.
  • ์ด๋•Œ A์™€ B์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋Š” B์™€ R์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์™€ ๊ฐ™๋‹ค.

๐Ÿ‘‡๐Ÿป ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์˜ ์•„์ด๋””์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋Š” 6์ด๋‹ค.

๐Ÿ‘‡๐Ÿป ์œ„์˜ ๋กœ์ง์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด? ๐Ÿ‘€ ๊ผญ A > B ์•„๋‹ˆ์–ด๋„ ๋™์ž‘ํ•œ๋‹ค

def gcd(a, b):
    # a๊ฐ€ b์˜ ๋ฐฐ์ˆ˜๋ผ๋ฉด b ๋ฐ˜ํ™˜
	if a % b == 0:	
		return b   
    # a๊ฐ€ b์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด b๊ฐ€ a๋กœ ๊ฐ€๊ณ 
    # a % b๊ฐ€ b๋กœ ๊ฐ€๋ฉด์„œ ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ
    else:	
		return gcd(b, a % b)    

print(gcd(192, 162))

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

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

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

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

๊ฒฐ๊ณผ : ์ œ์ผ ์ฒ˜์Œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ๋จ ๐Ÿ‘‰๐Ÿป ์Šคํƒ๊ณผ ๋น„์Šทํ•˜๋‹ค!


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

์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต๋ฌธ๋ณด๋‹ค ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  ๋ถˆ๋ฆฌํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

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




๐Ÿ“Œ DFS : Depth-First Search

  • DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ(or ์žฌ๊ท€ ํ•จ์ˆ˜)๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

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

    3. ๋” ์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต


DFS ๋™์ž‘ ์˜ˆ์‹œ

  • 1๏ธโƒฃ ๊ทธ๋ž˜ํ”„ ์ค€๋น„
    โœ”๏ธ ์‹œ์ž‘ ๋…ธ๋“œ๋Š” 1
    โœ”๏ธ ๋ฐฉ๋ฌธ ๊ธฐ์ค€์€ ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ธ์ ‘ ๋…ธ๋“œ๋ถ€ํ„ฐ
    โœ”๏ธ ๋ฌด๋ฐฉํ–ฅ ๊ฐ„์„ 

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

  • 3๏ธโƒฃ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 1์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 2, 3, 8 ์ด ์žˆ๋‹ค. ์ด ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ธ 2๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์ด์ œ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋Š” 2๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค!

  • 4๏ธโƒฃ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 2์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 7์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 7๋ฒˆ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์ธ์ ‘ ๋…ธ๋“œ ์ค‘ 7๋ณด๋‹ค ๋ฒˆํ˜ธ๊ฐ€ ๋” ๋‚ฎ์€ 1์ด ์žˆ์ง€๋งŒ, ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ PASS ๋‹ค์‹œ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋Š” 7๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค!

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

  • 6๏ธโƒฃ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 6์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํƒ์—์„œ ๋…ธ๋“œ 6์„ ๊บผ๋‚ธ๋‹ค. 6์„ ๊บผ๋ƒˆ์œผ๋ฉด ๋‹ค์‹œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋Š” 7์ด ๋œ๋‹ค.

  • 7๏ธโƒฃ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์ธ 7์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 8์ด ์žˆ์œผ๋ฏ€๋กœ ๋…ธ๋“œ 8์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • 8๏ธโƒฃ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์˜€์„ ๋•Œ ์ „์ฒด ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ(์Šคํƒ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๐Ÿ‘‡๐Ÿป

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

python

# 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 = [
	[],  # ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ์— 0์€ ๋น„์›Œ๋‘ 
	[2, 3, 8],  # ๋…ธ๋“œ 1
    [1, 7],  # ๋…ธ๋“œ 2
	[1, 4, 5],  # ๋…ธ๋“œ 3
	[3, 5],  # ๋…ธ๋“œ 4
	[3, 4],  # ๋…ธ๋“œ 5
    [7],  # ๋…ธ๋“œ 6
	[2, 6, 8],  # ๋…ธ๋“œ 7
	[1, 7]  # ๋…ธ๋“œ 8
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ (1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False] * 9  # ์ธ๋ฑ์Šค 0์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด 1 ๋” ํฌ๊ฒŒ ์ƒ์„ฑ

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

Java

import java.util.*;

public class Main {

    public static boolean[] visited = new boolean[9];
    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();

    // DFS ํ•จ์ˆ˜ ์ •์˜
    public static void dfs(int x) {
        // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[x] = true;
        System.out.print(x + " ");
        // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
        for (int i = 0; i < graph.get(x).size(); i++) {
            int y = graph.get(x).get(i);
            if (!visited[y]) dfs(y);
        }
    }

    public static void main(String[] args) {
        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < 9; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(1).add(2);
        graph.get(1).add(3);
        graph.get(1).add(8);
     
        // ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(2).add(1);
        graph.get(2).add(7);

        // ๋…ธ๋“œ 3์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(3).add(1);
        graph.get(3).add(4);
        graph.get(3).add(5);

        // ๋…ธ๋“œ 4์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(4).add(3);
        graph.get(4).add(5);

        // ๋…ธ๋“œ 5์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(5).add(3);
        graph.get(5).add(4);

        // ๋…ธ๋“œ 6์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(6).add(7);

        // ๋…ธ๋“œ 7์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(7).add(2);
        graph.get(7).add(6);
        graph.get(7).add(8);

        // ๋…ธ๋“œ 8์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(8).add(1);
        graph.get(8).add(7);

        dfs(1);
    }
}




๐Ÿ“Œ BFS : Breadth-First Search

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

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

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

    3. ๋” ์ด์ƒ 2๋ฒˆ์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต


BFS ๋™์ž‘ ์˜ˆ์‹œ

  • 1๏ธโƒฃ ๊ทธ๋ž˜ํ”„ ์ค€๋น„
    โœ”๏ธ ์‹œ์ž‘ ๋…ธ๋“œ๋Š” 1
    โœ”๏ธ ๋ฐฉ๋ฌธ ๊ธฐ์ค€์€ ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ธ์ ‘ ๋…ธ๋“œ๋ถ€ํ„ฐ
    โœ”๏ธ ๋ฌด๋ฐฉํ–ฅ ๊ฐ„์„ 

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

  • 3๏ธโƒฃ ํ์—์„œ ๋…ธ๋“œ 1์„ ๊บผ๋‚ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ 2, 3, 8์„ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ์ด๋•Œ, ํ์— ๋„ฃ๋Š” ์ˆœ์„œ๋Š” ๋ฐฉ๋ฌธํ•œ ์ˆœ์„œ๋Œ€๋กœ์ด๋ฏ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ธ์ ‘ ๋…ธ๋“œ๋ถ€ํ„ฐ์ด๋‹ค.

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

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

  • 6๏ธโƒฃ ํ์—์„œ ๋…ธ๋“œ 8๋ฅผ ๊บผ๋ƒˆ์ง€๋งŒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ PASS

  • 7๏ธโƒฃ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์˜€์„ ๋•Œ ์ „์ฒด ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ(ํ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๐Ÿ‘‡๐Ÿป

    ๋…ธ๋“œ 1์„ ๊ธฐ์ค€์œผ๋กœ 2, 3, 8์˜ ๊ฑฐ๋ฆฌ๋Š” 1 ย ย 7, 4, 5์˜ ๊ฑฐ๋ฆฌ๋Š” 2 ย ย 6์˜ ๊ฑฐ๋ฆฌ๋Š” 3์ด๋‹ค.

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

python

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 = [
	[],  # ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ์— 0์€ ๋น„์›Œ๋‘ 
	[2, 3, 8],  # ๋…ธ๋“œ 1
    [1, 7],  # ๋…ธ๋“œ 2
	[1, 4, 5],  # ๋…ธ๋“œ 3
	[3, 5],  # ๋…ธ๋“œ 4
	[3, 4],  # ๋…ธ๋“œ 5
    [7],  # ๋…ธ๋“œ 6
	[2, 6, 8],  # ๋…ธ๋“œ 7
	[1, 7]  # ๋…ธ๋“œ 8
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„ (1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False] * 9  # ์ธ๋ฑ์Šค 0์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด 1 ๋” ํฌ๊ฒŒ ์ƒ์„ฑ

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

Java

import java.util.*;

public class Main {

    public static boolean[] visited = new boolean[9];
    public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();

    // BFS ํ•จ์ˆ˜ ์ •์˜
    public static void bfs(int start) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(start);
        // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[start] = true;
        // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(!q.isEmpty()) {
            // ํ์—์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ๋ฝ‘์•„ ์ถœ๋ ฅ
            int x = q.poll();
            System.out.print(x + " ");
            // ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์›์†Œ๋“ค์„ ํ์— ์‚ฝ์ž…
            for(int i = 0; i < graph.get(x).size(); i++) {
                int y = graph.get(x).get(i);
                if(!visited[y]) {
                    q.offer(y);
                    visited[y] = true;
                }
            }
        }
    }

    public static void main(String[] args) {
        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < 9; i++) {
            graph.add(new ArrayList<Integer>());
        }

        // ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(1).add(2);
        graph.get(1).add(3);
        graph.get(1).add(8);

        // ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(2).add(1);
        graph.get(2).add(7);

        // ๋…ธ๋“œ 3์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(3).add(1);
        graph.get(3).add(4);
        graph.get(3).add(5);

        // ๋…ธ๋“œ 4์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(4).add(3);
        graph.get(4).add(5);

        // ๋…ธ๋“œ 5์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(5).add(3);
        graph.get(5).add(4);

        // ๋…ธ๋“œ 6์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(6).add(7);

        // ๋…ธ๋“œ 7์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(7).add(2);
        graph.get(7).add(6);
        graph.get(7).add(8);

        // ๋…ธ๋“œ 8์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ 
        graph.get(8).add(1);
        graph.get(8).add(7);

        bfs(1);
    }
}



โœ”๏ธ [์‹ค์Šต] ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค๋จน๊ธฐ ๐ŸงŠ


์†Œ์Šค์ฝ”๋“œ

python

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

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
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, y - 1)
        dfs(x + 1, y)
        dfs(x, y + 1)
        return True
    return False


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

print(result) # ์ •๋‹ต ์ถœ๋ ฅ

Java

import java.util.*;

public class Main {

    public static int n, m;
    public static int[][] graph = new int[1000][1000];

    // DFS๋กœ ํŠน์ • ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๋„ ๋ฐฉ๋ฌธ
    public static boolean dfs(int x, int y) {
        // ์ฃผ์–ด์ง„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฆ‰์‹œ ์ข…๋ฃŒ
        if (x <= -1 || x >=n || y <= -1 || 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;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
        n = sc.nextInt();
        m = sc.nextInt();
        sc.nextLine(); // ๋ฒ„ํผ ์ง€์šฐ๊ธฐ

        // 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
        for (int i = 0; i < n; i++) {
            String str = sc.nextLine();
            for (int j = 0; j < m; j++) {
                graph[i][j] = str.charAt(j) - '0';
            }
        }

        // ๋ชจ๋“  ๋…ธ๋“œ(์œ„์น˜)์— ๋Œ€ํ•˜์—ฌ ์Œ๋ฃŒ์ˆ˜ ์ฑ„์šฐ๊ธฐ
        int result = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // ํ˜„์žฌ ์œ„์น˜์—์„œ DFS ์ˆ˜ํ–‰
                if (dfs(i, j)) {
                    result += 1;
                }
            }
        }
        System.out.println(result); // ์ •๋‹ต ์ถœ๋ ฅ 
    }
}



โœ”๏ธ [์‹ค์Šต] ๋ฏธ๋กœ ํƒˆ์ถœ ๐Ÿ’ซ


์†Œ์Šค์ฝ”๋“œ

python

from collections import deque

# N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
n, m = map(int, input().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 ์†Œ์Šค์ฝ”๋“œ ๊ตฌํ˜„
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]

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

Java

import java.util.*;

class Node {

    private int x;
    private int y;

    public Node(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }
}

public class Main {

    public static int n, m;
    public static int[][] graph = new int[201][201];

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

    public static int bfs(int x, int y) {
        // ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ 
        Queue<Node> q = new LinkedList<>();
        q.offer(new Node(x, y));
        // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ธฐ 
        while(!q.isEmpty()) {
            Node node = q.poll();
            x = node.getX();
            y = node.getY();
            // ํ˜„์žฌ ์œ„์น˜์—์„œ 4๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์œ„์น˜ ํ™•์ธ
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                // ๋ฏธ๋กœ ์ฐพ๊ธฐ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฌด์‹œ
                if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
                // ๋ฒฝ์ธ ๊ฒฝ์šฐ ๋ฌด์‹œ
                if (graph[nx][ny] == 0) continue;
                // ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
                if (graph[nx][ny] == 1) {
                    graph[nx][ny] = graph[x][y] + 1;
                    q.offer(new Node(nx, ny));
                } 
            } 
        }
        // ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜
        return graph[n - 1][m - 1];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
        n = sc.nextInt();
        m = sc.nextInt();
        sc.nextLine(); // ๋ฒ„ํผ ์ง€์šฐ๊ธฐ

        // 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
        for (int i = 0; i < n; i++) {
            String str = sc.nextLine();
            for (int j = 0; j < m; j++) {
                graph[i][j] = str.charAt(j) - '0';
            }
        }

        // BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        System.out.println(bfs(0, 0));
    }
}
profile
๋ฐฑ์—”๋“œ ๋ณ‘์•„๋ฆฌ ๐Ÿฅ

0๊ฐœ์˜ ๋Œ“๊ธ€