250x250
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 | 31 |
Tags
- python
- 플랫폼 클래스 로더
- 컴포넌트 스캔
- dfs
- 객체지향
- 다이렉트 레퍼런스
- BFS
- 파이썬 문자열 메서드
- aws saa-c03
- stop the world
- python list method
- 심볼릭 레퍼런스
- getreference
- 부트스트랩 클래스 로더
- 백준
- AWS SAA-C03 합격후기
- 어플리케이션 클래스 로더
- 스프링 컨테이너
- 알고리즘
- 파이썬 리스트 메서드
- java
- 자바
- 코딩테스트
- 2026 AWS SAA-C03
- 딕셔너리
- Spring
- 클래스 로더 계층
- 파이썬
- 스프링
- 자료구조
Archives
- Today
- Total
클라우드 낚시꾼
[백준] 2178번 미로 탐색 Python3 - BFS 본문
728x90


시간 복잡도와 공간 복잡도


N과 M의 최댓값은 100이기에 미로의 최대 크기는 10000이다. 미로 탐색을 10000번 하더라도 1초에 2000만번 연산이 가능한 Python3에 10000번의 연산은 그리 무거운 연산이 아니다. 시간 복잡도는 O(n^3) 이상만 아니면 될 거라고 생각했다.
자연어 알고리즘과 코드
참고) 2차원 리스트 graph의 요소 값이 1이면 처음 방문한 좌표, 0이면 벽, 음수면 맵 범위 밖이다.
만약, graph의 좌표 값이 2이상 양수면 시작 점으로부터 그 좌표까지의 거리를 의미한다.
1. 미로 그래프와 상하좌우 방향을 지정하는 리스트를 생성한다.
2. 시작 지점을 0,0으로 설정하여 미로 탐색을 시작한다.
3. queue에 시작 지점 좌표를 append 한다.
4. qeueue의 front에 있는 현재 좌표 정보를 popleft(dequeue) 한다.
5. 현재 좌표에서 상하좌우로 각각 한칸 씩 이동하여 다음 좌표를 찾는다
- 만약, 다음 좌표가 맵 범위를 벗어나면 다음 방향으로 넘어간다.
- 만약, 다음 좌표가 벽에 도달하면(0) 다음 방향으로 넘어간다.
- 다음 좌표로 처음 방문한 좌표(1로 설정됨)에 도달하면 현재 좌표의 값에 +1 하여 다음 좌표의 값을 설정한다
6. 다음 좌표의 값을 queue에 enqueue(append) 한다.
7. 4~6 과정을 queue가 빌 때까지 한다.
8. 미로 탐색이 끝나면 graph[n-1][m-1]을 리턴하고 출력한다.
from collections import deque
import sys
input = sys.stdin.readline
n,m = map(int, map(int, input().split()))
# 상, 하, 좌, 우
dx = [-1,1,0,0]
dy = [0,0,-1,1]
# 미로 생성
graph = []
for i in range(n):
graph.append(list(map(int, input().rstrip())))
# 미로 탐색
def bfs_maze(x,y):
queue = deque()
queue.append((x,y))
# queue가 empty가 될때까지 반복한다.
while queue:
#현재 좌표
x,y = queue.popleft()
#현재 좌표에서 상,하,좌,우로 움직인다.
for i in range(4):
# 다음 좌표
nx = x + dx[i]
ny = y + dy[i]
# 다음 좌표가 미로를 벗어난다면 pass
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
# 다음 좌표가 벽(0)이라면 pass
if graph[nx][ny] == 0:
continue
# 다음 좌표가 벽(1)이라면 다음 좌표의 값을 현재 좌표의 값 + 1로 설정한다.
# graph의 요소 value는 0,0 시작으로부터 그 좌표까지 이동 거리를 의미한다.
if graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1
queue.append((nx,ny))
# 최종 이동 거리를 반환한다.
return graph[n-1][m-1]
print(bfs_maze(0,0))# 미로 탐색 호출
세 줄 요약
1. 새로운 방식의 BFS 탐색법
2. Graph의 요소 값이 2이상의 양수면 시작 점으로부터 그 좌표까지의 이동 거리이다.
3. 조건 별로 잘 체크하자
728x90
'CodingTest > 문제풀이' 카테고리의 다른 글
| [백준] 16956번 늑대와 양 - Python3 (애드 혹 문제, 이 문제가 정말 BFS 문제 일까?) (1) | 2023.12.24 |
|---|---|
| [백준] 2667번 단지번호붙이기 DFS - Python3 (1) | 2023.12.21 |
| [백준] 1325번 효율적인 해킹 BFS/DFS Python - pypy3 (1) | 2023.12.20 |
| [백준] 11725번 트리의 부모 찾기 (Python) - RecursionError 발생 (2) | 2023.12.20 |
| [백준] 1260번 DFS와 BFS (Python) (0) | 2023.12.19 |