Development/CodingTest

λ„ˆλΉ„ μš°μ„  탐색(BFS)

Kirok Kim 2021. 12. 28. 21:19

λ„ˆλΉ„ μš°μ„  탐색(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

# μ •μ˜λœ DFS ν•¨μˆ˜ 호좜
bfs(graph,1,visited)

>>> 1 2 3 8 7 4 5 6  
# 미둜 νƒˆμΆœ
# 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] ==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,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λ₯Ό μˆ˜ν–‰ν•œ κ²°κ³Ό 좜λ ₯
print(bfs(0,0))
λ°˜μ‘ν˜•