14940번 쉬운 최단거리
BFS
실버 I
💡문제 분석 요약
BFS
💡알고리즘 설계
BFS를 통해 구현했다.
2인 항목을 찾아서 queue에 먼저 넣는다.
위 아래 오른쪽 왼쪽의 x,y값을 확인한다.
vistied를 통해 방문 여부를 체크하고, 방문하지 않았고+값이 1이라면 queue에 넣어준다.
만약 방문하지 않았는데 갈 수 있는 땅이라면, 값을 -1로 바꿔주고 출력한다.
💡코드
import sys, collections
queue = collections.deque()
input= sys.stdin.readline
n,m = map(int,input().strip().split())
x1 = [0,0,1,-1]
y1 = [1,-1,0,0]
visited = [[False for _ in range(m)]for _ in range(m)]
maps = []
for _ in range(n):
maps.append(list(map(int,input().strip().split())))
for i in range(n):
for j in range(m):
if maps[i][j]==2:
queue.append([i,j,0])
while queue:
x,y,distance = queue.popleft()
if visited[x][y] == True:
continue
visited[x][y] = True
maps[x][y] = distance
new_distance = distance+1
for i in range(4):
dx = x+x1[i]
dy = y+y1[i]
if 0<=dx<n and 0<=dy<m and visited[dx][dy]==False and maps[dx][dy]==1:
queue.append([dx,dy,new_distance])
for i in range(n):
for j in range(m):
if visited[i][j]==False and maps[i][j]==1:
maps[i][j]=-1
print(maps[i][j],end=' ')
print()
💡 헷갈린 이유
- visited를 쓰지 않고 구현하려고 했지만 거리가 1인 경우가 있어 무한 루프가 됨.
- 방문하지 않아서 queue에 넣었지만 방문하지 않은 상태가 유지되므로, dx,dy값이 중복되어 queue에 같은 값이 들어가서 탐색하는 경우가 발생됨. 따라서 visited가 True인지 확인하는 구문을 맨 위에 추가→ 이게 아니면 visited를 queue에 추가한 뒤 바로 True로 바꿀 수도 있음.
- 갈 수 있는 땅이지만 갈 수 없는 경우를 고려하지 않음