🖥️문제 링크
https://www.acmicpc.net/problem/14940
14940번: 쉬운 최단거리
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이
www.acmicpc.net
🎀해결 방법
queue를 사용해서 BFS로 시작했다
1. queue 생성
2. 시작점 찾아서 queue에 넣기 + 0인 부분 표시하기
3. 방향 바꿔가면서 범위, 이동 가능여부 확인 후 queue에 넣기
큰 형식은 이렇게 생각하고 문제를 풀었다
🐸직면한 문제
1. 닿지 못하는 부분은 -1로 처리 (문제 잘 읽기,,🤣)
2. arr에서 벽에 막힌 부분이 1로 표시되는 문제
3. n, m 을 반대로 쓴 문제..
두번째 문제에서는
마지막에 -1로 바꿔서 출력할 수 있었지만, 출발점에서 1인 경우와 겹칠 수 있어서
기존에 -1로 채워놓았던 visited에 벽을 표시하고, 거리를 기록하는 방식으로 수정해서
문제를 해결할 수 있었다
예제가 한 개뿐이라서 틀린 이유를 어려웠다. 그래서 여러 반례를 테스트 해봤는데,
혹시 이 반례들이 다 맞는 경우라면 꼭 기본적인 n, m 같은 코드를 확인해야 한다
🐯반례
#input
3 3
2 0 1
0 1 1
1 1 1
#anser
0 0 -1
0 -1 -1
-1 -1 -1
#input
2 2
2 0
0 0
#answer
0 0
0 0
✨BFS - 정답 코드
from collections import deque
n,m = map(int,input().split())
queue = deque([])
arr = []
visited = [[-1]*m for _ in range(n)] # 기존에 만든 visited
for i in range(n):
li = list(map(int, input().split(' ')))
for j in range(m):
if li[j] == 2:
queue.append((i,j))
visited[i][j] = 0
elif li[j] == 0: # 벽인 경우는 visited에도 0으로 표시
visited[i][j] = 0
arr.append(li)
direc = [(0,1),(1,0),(0,-1),(-1,0)]
while queue:
(x,y) = queue.popleft()
for d in direc:
nx, ny = x + d[0], y + d[1]
if 0 <= nx < n and 0 <= ny < m:
if visited[nx][ny] == -1 and arr[nx][ny] == 1:
queue.append((nx,ny))
visited[nx][ny] = visited[x][y] + 1
arr[nx][ny] = 0 # 입력 받았던 arr에 지나간 표시
for i in visited:
print(*i)
'알고리즘 > Python' 카테고리의 다른 글
프로그래머스 징검다리 건너기(Python) - 이분탐색 (0) | 2023.09.23 |
---|---|
프로그래머스 게임 맵 최단거리(Python) - DFS, BFS (0) | 2023.01.15 |