일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- node.js
- CSS
- 리액트
- 파이썬
- 웹
- docker
- 이슈
- 알고리즘
- es6
- 가상화
- k8s
- 백준
- 백엔드
- AWS
- HTML
- 쿠버네티스
- 이더리움
- 프론트엔드
- 블록체인
- kubernetes
- react
- 컴퓨터공학
- 클라우드
- JavaScript
- 자바스크립트
- next.js
- 타입스크립트
- TypeScript
- BFS
- 솔리디티
Archives
- Today
- Total
즐겁게, 코드
BOJ 2178번 - 미로 탐색 본문
문제 분류가 BFS로 되어있어 별 생각없이 BFS로 탐색을 구현했지만, DFS를 사용하면 시간 초과가 난다고 한다.
DFS를 사용하는 코드는 약간 백트래킹? 하듯이 분기별로 값을 저장해둔 뒤 저장한 값들 중 최솟값을 구하면 될 듯 한데...
나보다 잘 짜는 사람들이 안된다는 데에는 이유가 있을 것이다. (_ _)
아무튼 최단거리를 구하는 문제는 BFS 방식을 사용하는 것이 정석이라고 한다.
앞으로 비슷한 유형은 BFS를 열심히 우려먹자.
(예전에 얼핏 어떤 문제 유형은 BFS와 DFS중 하나로밖에 풀지 못한다는 내용을 바킹독님 블로그에서 본 것 같은데, 아마 이거인듯 하다.)
[정답 코드 - Python]
from collections import deque
N, M = map(int, input().split())
maze = [list(map(int, input())) for _ in range(N)]
visited = [[False] * M for _ in range(N)]
dy = [1, 0, -1, 0]
dx = [0, 1, 0, -1]
def BFS(start_node):
y, x = start_node # 튜플형을 사용하면 둘 이상의 매개변수도 쉽게 분해할 수 있다.
queue = deque()
queue.append((y, x))
visited[y][x] = True
while len(queue) != 0:
curY, curX = queue.popleft()
for i in range(4):
nextY = curY + dy[i]
nextX = curX + dx[i]
if 0 <= nextY < N and 0 <= nextX < M:
if visited[nextY][nextX] == False and maze[nextY][nextX] != 0:
visited[nextY][nextX] = True
queue.append((nextY, nextX))
maze[nextY][nextX] = maze[curY][curX] + 1
BFS((0, 0))
print(maze[N - 1][M - 1])
카운트 변수를 사용하면 단순히 미로의 1이 몇 개나 있는지 찾는 것에 불과하다.
대신 다음에 밟는 미궁의 좌표에 도달하는데 몇 개의 경로를 거쳤는지 메모해주기만 하면 된다.
(DFS와는 달리, 모든 방향으로 한 칸씩 뻗어나므로 이상한 루트를 빙글빙글 돌 걱정은 하지 않아도 된다!)
반응형
'💯 알고리즘 > 백준 온라인 저지' 카테고리의 다른 글
BOJ 17206번 - 준석이의 수학 숙제 (0) | 2021.04.12 |
---|---|
BOJ 9047번 - 6174 (0) | 2021.04.10 |
BOJ 2667번 - 단지번호붙이기 (1) | 2021.03.29 |
BOJ 1012번: 유기농 배추 (0) | 2021.03.13 |
BOJ 1932번 - 정수 삼각형 (1) | 2021.03.10 |
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆