Bibbidi Bobbidi Boo

* 알고리즘 너무 약해서 기초 문제 50개 목표로 푸는 중...

* 3시간 안에 답을 내지 못하면 답지를 보고 30분 내로 정답 판정을 받고, 3일 뒤 다시 풀어보기


Greedy 50문제 풀기

1 / 50

 

탐색 50문제 풀기

1 / 50(NEW!)

 

기초 동적 프로그래밍 50문제 풀기

1 / 50

 

투포인터 10문제 풀기

0 / 10


문제

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net


문제 해결 아이디어

(이것이 취업을 위한 코딩테스트다에서 나온 BFS 예제 문제와 해결 방법이 같음)

 

이동하면서 최소 칸의 수를 찾는다 ==> 탐색

그래프에서 가장 가까운 노드부터 우선적으로 탐색하는 BFS 사용

상하좌우로 연결된 모든 노드의 거리는 1로 동일하므로

(1,1) 지점부터 BFS를 수행해 모든 노드의 최단 거리 값을 기록


구현

내 풀이

from collections import deque

# BFS 소스 코드 구현
def bfs(x, y):
  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]
  
n, m = map(int, input().split())

graph = []
for i in range(n):
  graph.append(list(map(int, input())))

# 이동할 네 가지 방향 정의 (상, 하, 좌, 우)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

print(bfs(0, 0))

메모

  • 걸린 시간 : 20분...?
    • 같은 패턴의 문제를 이미 예제로 접해서 바로 푼 문제

profile

Bibbidi Bobbidi Boo

@비비디

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!