문제 : https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이
전형적인 BFS 2단계 최단거리 문제.
- 1단계: S에서 BFS를 돌려 L까지의 최단 거리를 구함
- 2단계: L에서 BFS를 돌려 E까지의 최단 거리를 구함
- 두 거리를 더해서 반환. 둘 중 하나라도 도달 불가능하면 -1
작성한 코드
import java.util.*;
public class Solution {
public int solution(String[] maps) {
int n = maps.length;
int m = maps[0].length();
char[][] grid = new char[n][m];
int[] start = null, lever = null, exit = null;
// 탐사를 위한 2중 배열 맵 제작
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
char c = maps[i].charAt(j);
grid[i][j] = c;
if (c == 'S') start = new int[]{i,j};
else if (c == 'L') lever = new int[]{i,j};
else if (c == 'E') exit = new int[]{i, j};
}
}
// 시작점 ~ 레버 거리
int distToLever = bfs(grid, start, lever, n, m);
if (distToLever == -1) return -1;
// 레버 ~ 종료점 거리
int distToExit = bfs(grid, lever, exit, n, m);
if (distToExit == -1) return -1;
return distToLever + distToExit;
}
private static int bfs (char[][] grid, int[] start, int[] target, int n, int m) {
// 거리 저장용 이중 배열 (모든 거리 -1로 초기화)
int[][] dist = new int[n][m];
for (int[] row : dist) Arrays.fill(row, -1);
// 델타 배열
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
// 시작점 설정
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{start[0], start[1]});
dist[start[0]][start[1]] = 0;
// BFS 시작
while (!queue.isEmpty()) {
int[] cur = queue.poll();
int x = cur[0], y = cur[1];
if (x == target[0] && y == target[1]) {
return dist[x][y];
}
// 델타 배열로 근처 칸을 큐에 추가
for (int d = 0; d < 4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (grid[nx][ny] == 'X') continue;
if (dist[nx][ny] != -1) continue;
dist[nx][ny] = dist[x][y] + 1;
queue.offer(new int[]{nx, ny});
}
}
return dist[target[0]][target[1]];
}
}
참고 :
https://record47584.tistory.com/36
델타 배열을 이용해 2차원 배열 탐색하기
2차원 배열"행(row)"과 "열(column)" 두 차원을 가진 배열 (논리적 시점) 1차원 배열을 요소로 가지는 배열 (코드 시점) 2차원 배열을 활용하면, 게임의 보드판(예: 오목판, 체스판), 이미지의 픽셀 정보
record47584.tistory.com
https://record47584.tistory.com/63
BFS(너비 우선 탐색)
BFS(너비 우선 탐색)란? 그래프나 트리에서 시작 노드로부터 가까운 노드를 먼저 방문하고 멀리 떨어진 노드를 나중에 방문하는 알고리즘주로 큐를 이용해 구현 특징최단 경로 보장 : 가중치가
record47584.tistory.com
'자료구조 & 알고리즘 > 문제 풀이 (프로그래머스)' 카테고리의 다른 글
| 혼자 놀기의 달인 (DFS) (0) | 2026.07.31 |
|---|---|
| 하노이의 탑 (재귀) (0) | 2026.07.24 |
| 테이블 해시 함수 (정렬, XOR) (0) | 2026.07.23 |
| 시소 짝꿍 (0) | 2026.07.21 |
| 멀쩡한 사각형 (최대공약수) (0) | 2026.07.20 |



