Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- PCB
- 기사단원의 무기 파이썬
- 프로세스
- Spring Security 버전 문제
- 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
- Python 1000000007
- 이코테2021
- 달리기 경주 파이썬
- Spring Security 5
- java 동기화
- 기사단원의 무기 제곱근
- commit message convention
- finalize 수동 호출
- RDBMS와 NoSQL 차이
- @RequestMapping과 @GetMapping
- MySQL RIGHT()
- 달리기 경주 파이썬 시간초과
- MySQL LEFT()
- OOP의 특징
- 알고리즘 1000000007 나누기
- 웹 동작 과정
- 정규화 장단점
- 빌드관리도구
- 프로그래머스 142086
- DDL DML DCL 차이
- 백트래킹
- 모듈로 연산
- www.google.com 검색하면 일어나는 일
- build.gradle 설정 오류
- 빌드관리도구 차이
Archives
- Today
- Total
BUILD_SSO
[백준] 2178 미로탐색 python - BFS 본문
문제링크: https://www.acmicpc.net/problem/2178
예제 입력:
4 6
101111
101010
101011
111011
예제 출력:
15
풀이
과거에 풀었던 문제를 DFS/BFS 복기할겸 다시 풀어보았다.
최단거리라고 생각해서 DFS문제라고 생각했는데 과거에도 똑같은 방식으로 실수했던 기록이 있었다...(도대체 왜?) 문제를 다시 파악하고 BFS로 풀이하였다.
좌측 상단(1, 1)에서 우측 하단(4, 6)으로 이동하는 최소의 칸 수를 구하는 문제이다. 이것을 python list로 봤을때는 (0, 0)과 (n-1, m-1)이 된다.
아래 그림으로 보면 빨간 동그라미 지점에서 빨간 삼각형 지점으로 이동하는 최소칸의 수를 구하는 것이다.
*시작지점과 도착지점을 포함하는 조건이 있다.
이동 경로는 아래와 같다. 사실 문제에서 이동경로는 중요하지 않지만 문제 파악을 위해 넣었다.
정답 코드:
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
miro = []
for i in range(n):
miro.append(list(map(int, input().rstrip())))
#상하좌우
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
def bfs(x, y):
queue = deque()
queue.append((x, y))
#queue가 빌 때까지 반복한다
while queue:
x, y = queue.popleft() #이동하는 좌표
#상하좌우 방향으로 탐색한다
for i in range(4):
nx = x + dx[i] #이동한 위치는 nx가 된다
ny = y + dy[i]
#미로 범위를 벗어나는 이동은 불가능 하므로 continue
if 0 > nx or nx >= n or 0 > ny or ny >= m:
continue
#미로 범위 안이더라도 0이라면 이동 불가능 하므로 continue
if miro[nx][ny] == 0:
continue
#미로 범위 안이면서 1(이동가능)이라면
if miro[nx][ny] == 1:
#이동한 좌표 = 기존의 좌표 + 1 을 해서, 1칸 이동한 값으로 갱신시켜준다
miro[nx][ny] = miro[x][y] + 1
# 갱신된 이동한 좌표를 queue에 append한다
queue.append((nx, ny))
#우측하단에 위치한 값을 return한다
return miro[n-1][m-1]
print(bfs(0, 0))
'Problem Solving > Algorithm' 카테고리의 다른 글
[백준] 14889 스타트와 링크 python - 백트래킹, 조합 (0) | 2023.03.24 |
---|---|
[백준] 14888 연산자 우선순위 python - 구현, 백트래킹 (0) | 2023.03.22 |
Bruteforce: 브루트포스/완전탐색 알고리즘 (+구현) (0) | 2023.03.22 |
Greedy: 그리디 알고리즘 (0) | 2023.03.18 |
DFS/BFS 알고리즘 (0) | 2023.03.08 |
Comments