반응형
Recent Posts
Recent Comments
«   2025/12   »
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
Today
Total
관리 메뉴

꿈꾸는 개발자의 devLog

[Algorithm] DFS/BFS - 4 본문

Algorithm/AlgorithmStudy

[Algorithm] DFS/BFS - 4

덩화 2023. 8. 4. 00:30
반응형

[미로 탈출]

- NxM크기의 미로

- 시작 위치는 (1,1), 미로의 출구는 (N,M)

- 괴물이 있는 부분은 0, 괴물이 없는 부분은 1

- 탈출하기 위해 움직여야하는 최소 칸의 개수 출력 (칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산)

위와 같은 예시 인 경우, 총 움직여야 하는 칸의 개수는 다섯칸

 

[해석]

- 무조건 기억 ! DFS : 스택, 재귀 / BFS : deque (이게 헷갈려서 스택으로 풀 뻔 했다..)

- 최소 머시기를 구하라는 문제는 BFS로 탐색하면 될듯 하다

- 이 문제를 처음 봤을 때, 4방향을 살피고 괴물 유무를 파악한 후에 좌표 이동하는 것 까지 생각이 났지만 좌표 리스트를 어떻게 deque에 넣지? 라는 생각을 했따 (하지만 너무 간단한 방법..set() 방법을 사용해서 넣는 것이어따,,)

- deque에 첫 좌표를 넣고 4방향을 살핌 (4방향에 대한 리스트 값 미리 지정해야함)

- 만약, 벽이거나 이동 좌표에 괴물이 위치한다면 이동 하지 않음

- 그렇지 않다면 이동좌표 값에 1을 더해준다 - 왜냐고? 아래와 같이 생각하면 됨

이렇게 다음 좌표 값에 1을 더해주면 내가 움직이는 칸의 개수가 된다!! (** 이건 진짜 생각도 못했다 두둥..)

- 그런 다음에 이동 좌표를 다시 append 해주고 popleft해주고 위의 과정을 반복

- 이렇게 진행되고 마지막 즉, (n,m) 좌표에 위치한 값을 출력하면 끝..!

 

[코드] # 참고하였음

from collections import deque
n,m = map(int, input().split())

graph = []
for i in range(n): ## 이미 여기서 stack, list 만든거임
    graph.append(list(map(int, input()))) ## split을 안하면 입력할때 띄어쓰기로 입력 안해도 됨

## bfs : queue
## dfs : stack, 재귀

print(graph)

dx = [-1, 1, 0,0] ## 상하좌우
dy = [0, 0, -1, 1]

def bfs(x,y):
    q = deque()
    q.append((x,y))


    while q:

        x,y = q.popleft()

        for i in range(4): ## 4방향 탐색
            nx = x + dx[i]
            ny = y + dy[i]

            if nx >= n or nx < 0 or ny >= m or ny < 0: ## 크기 벗어나는지 확인
                continue

            if graph[nx][ny] == 0: ## 괴물 유무 확인
                continue

            if graph[nx][ny] == 1: ## 괴물이 없다면?
                graph[nx][ny] = graph[x][y] + 1 ## 해당좌표값 +1

                q.append((nx,ny)) ## 큐에 이동한 좌표 새로 삽입

    return graph[n-1][m-1] ## 마지막 좌표 값 출력 = 움직인 칸의 개수

print(bfs(0,0))

Ref : 나동빈, "이것이 코딩테스트다"

반응형

'Algorithm > AlgorithmStudy' 카테고리의 다른 글

[Algorithm] 정렬 - 2 #퀵 정렬  (0) 2023.08.10
[Algorithm] 정렬 - 1 #선택, 삽입 정렬  (1) 2023.08.04
[Algorithm] DFS/BFS - 3  (1) 2023.08.01
[Algorithm] DFS/BFS - 2  (0) 2023.08.01
[Algorithm] DFS/BFS - 1  (1) 2023.07.21
Comments