백준/ Gold 4 문제 , 백준 파이썬 1261, 알고스팟 [0-1 BFS]
Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하
<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
<덧붙일 말>
배운 0-1 BFS를 적용해본 문제. 기존 BFS 문제에서 if 문을 하나 추가한 것이지 특별하게 다른 점은 없다.
<문제 출처>
https://www.acmicpc.net/problem/1261
------------------------------------------------------------------------------------------------------------------------------
1. 벽을 부셔야하는 경우 -> 가중치 1
2. 그냥 통로 -> 가중치 0
0-1 BFS 를 적용하여 최대한 가중치 0을 위주로 경로를 탐색한다.
------------------------------------------------------------------------------------------------------------------------------
정답
from collections import deque
vertical=[1,-1,0,0]
parallel=[0,0,1,-1]
dq=deque()
M,N=map(int,input().split())
maze=[]
for i in range(N):
maze.append(list(map(int,input())))
def bfs():
while dq:
x,y=dq.popleft()
if x==N-1 and y==M-1:
break
for i in range(4):
mx=x+vertical[i]
my=y+parallel[i]
if 0<=mx<N and 0<=my<M:
if maze[mx][my]==1: # 벽을 부셔야 하는 경우 (가중치 1)
maze[mx][my]=maze[x][y]+1
dq.append([mx,my])
elif maze[mx][my]==0: # 그냥 지나갈 수 있는 통로 (가중치 0)
maze[mx][my]=maze[x][y]
dq.appendleft([mx,my]) # 우선 탐색
dq.append([0,0]) # 시작점 대입
maze[0][0]=2 # 재탐색 방지
bfs()
print(maze[N-1][M-1]-2)
반응형
'알고리즘 공부 > 백준 - 파이썬' 카테고리의 다른 글
백준/ Silver 1 문제 , 백준 파이썬 1389, 케빈 베이컨의 6단계 법칙 [BFS] (0) | 2022.07.21 |
---|---|
백준/ Bronze 1 문제 , 백준 파이썬 2167 , 2차원 배열의 합 (0) | 2022.07.21 |
백준/ Gold 5 문제 , 백준 파이썬 13549, 숨바꼭질 3 [0-1 BFS] (0) | 2022.07.20 |
백준/ Silver 1 문제 , 백준 파이썬 1926, 그림 [BFS] (0) | 2022.07.20 |
백준/ Silver 1 문제 , 백준 파이썬 2583, 영역 구하기 [BFS] (0) | 2022.07.20 |