09-03. BFS(너비 우선 탐색)

0. 문제 유형

  • 최단 경로 탐색

1. 게임 맵 최단거리

  • 프로그래머스 Lv.2 / 체감 난이도 Lv.2

  • 대표적인 최단경로 탐색 문제

import java.util.*;

class Solution {
    int[] dx = {1, 0, -1, 0}; // 행 이동
    int[] dy = {0, 1, 0, -1}; // 열 이동
    
    class Point {
        int x, y, distance;
        Point(int x, int y, int distance) {
            this.x = x;
            this.y = y;
            this.distance = distance;
        }
    }
    
    public int solution(int[][] maps) {
        int n = maps.length;
        int m = maps[0].length;
        boolean[][] visited = new boolean[n][m];
        
        Deque<Point> deq = new ArrayDeque<>();
        deq.offerLast(new Point(0, 0, 1));
        visited[0][0] = true;
        
        while (!deq.isEmpty()) {
            Point current = deq.pollFirst();
            
            // 도착지점에 도달한 경우
            if (current.x == n-1 && current.y == m-1) {
                return current.distance;
            }
            
            // 4방향 탐색
            for (int i = 0; i < 4; i++) {
                int nx = current.x + dx[i];
                int ny = current.y + dy[i];
                
                // 맵 범위 내이고, 벽이 아니고, 방문하지 않은 경우
                if (nx >= 0 && nx < n && ny >= 0 && ny < m
                   && maps[nx][ny] == 1 && !visited[nx][ny]) {
                    visited[nx][ny] = true;
                    deq.offerLast(new Point(nx, ny, current.distance + 1));
                }
            }
        }
        
        return -1;
    }
}

2. 아이템 줍기

  • 프로그래머스 Lv.3 / 체감 난이도 Lv.4

  • 최단거리 문제인데, 경로를 새로 만들어줘야함

  • 경로가 아닌 부분도 볼 수 있어서 크기를 2배로 늘리기

3. 퍼즐 조각 채우기

  • 프로그래머스 Lv.3 / 체감 난이도 Lv.5

  • 어려움

4. [카카오 인턴] 경주로 건설

  • 프로그래머스 Lv.3 / 체감 난이도 Lv.5

  • 단순히 최단 거리가 아니라 최소 비용을 찾아야 한다.

  • 하지만, 직진과 코너가 비용이 다르다

    • 직진 : 100원

    • 코너 : 600원(직진 비용 추가)

  • 따라서 한 지점에 도착했을 때, 그게 직진으로 온 값인지, 코너에서 온 값인지 알아야한다.(방향)

5. 부대복귀

  • 프로그래머스 Lv.3 / 체감 난이도 Lv.3

  • destination에서 시작하는 최단 거리 구하는 문제

Last updated