Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

BOJ 2178번 - 미로 탐색 본문

💯 알고리즘/백준 온라인 저지

BOJ 2178번 - 미로 탐색

Chamming2 2021. 4. 2. 22:30

[백준 온라인 저지 링크]

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

문제 분류가 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
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆