너비 우선 탐색 예제 - 2

문제 분석

  • N, M의 최대 크기가 100으로 매우 작기 때문에 시간 제한은 별도로 생각하지 않아도 된다.

  • 문제의 요구사항은 지나야 하는 칸 수의 최솟값을 찾는 것이다. 이는 완전 탐색을 진행하며 몇 번째 깊이에서 원하는 값을 찾을 수 있는지 구하는 것과 동일하다.

  • BFS를 사용해 최초로 도달했을 때 깊이를 출력하면 문제를 해결할 수 있다.

  • DFS보다 BFS가 적합한 이유는 BFS는 해당 깊이에서 갈 수 있는 노드 탐색을 마친 후 다음 깊이로 넘어가기 때문이다.

손으로 풀어보기

  • 먼저 2차원 리스트에 데이터를 저장한 다음 (1, 1)에서 BFS를 실행한다.

  • 상, 하, 좌, 우 네 방향을 보며 인접한 칸을 본다.

  • 인접한 칸의 숫자가 1이면서 아직 방문하지 않았다면 큐에 삽입한다.

  • 종료 지점 (N, M)에서 BFS를 종료하며 깊이를 출력한다.

슈도코드

dx, dy(상하좌우를 탐색하기 위한 define값 정의 변수)
n(row), m(column)
A(데이터 저장 2차원 행렬)
visit(방문 기록 리스트)

for n 반복:
    for m 반복:
        A 리스트에 데이터 저장
        
BFS:
    큐에 시작 노드 삽입
    visit 방문 처리
    while 큐가 비어 있을 때까지:
        큐에서 노드 데이터 가져오기
        for 상하좌우 탐색:
            if 유효한 좌표:
                if 이동할 수 있는 칸이면서 방문하지 않은 노드:
                    visit 방문 처리
                    A 리스트에 현재 depth를 현재 노드의 depth + 1로 업데이트
                    큐에 데이터 삽입
                    
BFS(0, 0)실행
A[n-1][m-1] 출력

코드 구현 - 파이썬

코드 구현 - 자바

Last updated