BFS - 미로 탐색 [2178번]

2022. 7. 14. 10:512022/BaekJoon_알고리즘

BFS보다는 DFS로 풀이하는게 직관적이다 보니, BFS에 대한 풀이가 아직은 익숙하지 않다...

휴..이제 좀 열심히 해야지 ㅜㅜ

 

어쨌든 이번에도 역시나 DFS로 풀이를 했는데 시간초과가 났다...

해당 풀이는 아래와 같다.

def dfs(loc, curTime):
    global minTime
    if loc == [N-1, M-1]:
        minTime = min(minTime, curTime)
        return 
    
    chk = False
    for i in range(4):
        nx = loc[0]+dx[i]; ny = loc[1]+dy[i]
        if 0<=nx<N and 0<=ny<M and visited[nx][ny] == True:
            chk = True
            visited[nx][ny] = False
            dfs([nx, ny], curTime+1)
            visited[nx][ny] = True
            
    if chk == False:
        return
            
# 1 = 이동 가능한 칸, 0 = 이동 불가능한 칸
N, M = map(int, input().split())
miro = []; visited = []
minTime = 10000
dx = [1, 0, -1, 0]; dy = [0, 1, 0, -1]
for i in range(N):
    tmp = list(map(lambda x : int(x), list(input())))
    miro.append(tmp)
    
    tfList = list(map(lambda x : x == 1, tmp))
    visited.append(tfList)
    
dfs([0, 0], 1)
print(minTime)

 

일단 BFS 풀이에 앞서서 다시한번 DFS와 BFS에 적합한 유형을 정리해보자면,

 

 

  • DFS & BFS 상관이 없는 유형
    • 단순 모든 정점을 방문하는 것이 중요한 문제인 경우
  • DFS가 적합한 유형
    • 검색 대상 그래프가 큰 경우 = 정점과 간성의 개수가 큰 경우
    • 경로의 특징을 저장해야하는 경우 -> EX) A부터 B까지 가는 경로를 구하는데 있어서 같은 숫자가 있으면 안되는 경우 ( * BFS는 경로의 특징을 가지지 못 함)
  • BFS가 적합한 유형
    • 미로찾기와 같이 최단거리 구해야 하는 경우
    • 현재 노드에서 가까운것 부터 구하기 때문에 경로 탐색 시, 첫번째로 찾아지는 해답이 곧 최단거리

아래는 BFS로 풀이한 결과이다.

보통 BFS의 핵심은 Queue 사용이다. 여기에 대한 익숙도가 높아져야할 것으로 보인다.

# 1 = 이동 가능한 칸, 0 = 이동 불가능한 칸
N, M = map(int, input().split())
miro = []
for i in range(N):
    tmp = list(map(lambda x : int(x), list(input())))
    miro.append(tmp)
    
from collections import deque
q = deque([(0,0)])
dx = [1, 0, -1, 0]; dy = [0, 1, 0, -1]
while q:
    x, y = q.popleft()
    for i in range(4):
        nx = x+dx[i]; ny = y+dy[i]
        if 0<=nx<N and 0<=ny<M and miro[nx][ny] == 1:
            miro[nx][ny] = miro[x][y] + 1
            q.append((nx, ny))
print(miro)
print(miro[N-1][M-1])

'2022 > BaekJoon_알고리즘' 카테고리의 다른 글

BFS - 숨바꼭질 [1697번]  (0) 2022.07.15
BFS - 단지번호붙이기 [2667번]  (0) 2022.07.14
DFS - 연결 요소의 개수[11724번]  (0) 2022.04.18
DFS - DFS와BFS[1260번]  (0) 2022.04.17
DFS - 바이러스[2606번]  (0) 2022.04.09