본문 바로가기
Python

[이취코] 미로 탐색

by Leunco 2022. 2. 8.

출처 : 이것이 취업을 위한 코딩 테스트다 with python

같은 문제 : https://www.acmicpc.net/problem/2178

 

 


문제는 링크에 있는 백준에 들어가서 보면 된다. 이 문제 같은 경우는 경로의 길이를 세는 것이기 때문에, BFS로 해야 효과적으로 해결할 수 있다. BFS는 너비우선탐색으로 시작 지점에서 가까운 노드부터 차례대로 모든 노드를 탐색하기 때문이다. DFS는 재귀를 이용해 깊이 우선 탐색을 한다면, BFS는 큐로 어느 정도 탐색하는 지를 볼 수 있다.

 

여기 풀이에서 특이한 점은 경로의 길이가 원래 노드 값(0,1)을 대체하게끔 푼다는 점이다. 경로의 길이가 노드 값을 대체하기 때문에 마지막 (N-1, M-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): # (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 ny<0 or nx>=N or ny>=M: # 범위를 벗어나면 패스
                continue
            if graph[nx][ny] == 0: # 못 가는 곳이면 패스
                continue
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y]+1 # 방문경로의 길이값으로 graph 대체
                queue.append((nx,ny)) # 이동한 (nx,ny) 좌표를 queue에 넣어서 모든 경로를 다 파악할 수 있도록

    return graph[N-1][M-1] # 최종 (N-1,M-1) 좌표에 대체된 값(방문경로 길이)을 리턴

print(bfs(0,0))
반응형

'Python' 카테고리의 다른 글

[이취코] 숫자 카드 게임  (0) 2022.02.08
[이취코] 큰 수의 법칙  (0) 2022.02.08
[이취코] 음료수 얼려 먹기  (0) 2022.02.08
[해커랭크] Journey to the Moon  (0) 2022.02.08
[백준] 1715번 : 카드 정렬하기  (0) 2022.01.25

댓글