자료구조&알고리즘/프로그래머스
프로그래머스 - 미로탈출 (JAVA)
yong_ღ'ᴗ'ღ
2023. 10. 13. 03:17
https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제)
지도에서 시작(S) → 레버(L) → 출구(E) 순서로 가야한다.
접근 방식) BFS
1. O, X, S, L, E 문자 들어있는 char map[][] 배열 만듦
만들면서 Start와 Lever 위치 파악해서 좌표 저장해둠 (startX, startY, leverX, leverY)
2. 시작지점(S) → 레버(L) 까지 갈 수 있는지 bfs 실행
return 값이 -1이면 갈 수 없다는 뜻이므로 -1 반환하고 끝냄
3. 레버(L) → 출구(E) 까지 갈 수 있는지 bfs 실행
return 값이 -1이면 갈 수 없다는 뜻이므로 -1 반환하고 끝냄
4. 답 = 시작(S) → 레버(L) + 레버(L) → 출구(E)
import java.util.*;
class Solution {
static char[][] map;
static int[][] visited;
static int[] dx = {0, 0, -1, 1};
static int[] dy = {1, -1, 0, 0};
public int solution(String[] maps) {
int startX = 0; int startY = 0;
int leverX = 0; int leverY = 0;
map = new char[maps.length][maps[0].length()];
for (int i = 0; i < maps.length; i++) {
for (int j = 0; j < maps[i].length(); j++) {
map[i][j] = maps[i].charAt(j);
if (map[i][j] == 'S') {
startX = i;
startY = j;
}
if (map[i][j] == 'L') {
leverX = i;
leverY = j;
}
}
}
// 시작(S) → 레버(L)
int startToLever = bfs(startX, startY, 'L');
if (startToLever == -1) return -1;
// 레버(L) → 출구(E)
int leverToExit = bfs(leverX, leverY, 'E');
if (leverToExit == -1) return -1;
return startToLever + leverToExit;
}
static int bfs(int i, int j, char search) {
visited = new int[map.length][map[0].length];
for (int n = 0; n < visited.length; n++) {
for (int m = 0; m < visited[n].length; m++)
visited[n][m] = -1;
}
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{i, j});
visited[i][j] = 0;
while (!queue.isEmpty()) {
int[] now = queue.poll();
for (int k = 0; k < 4; k++) {
int x = now[0] + dx[k];
int y = now[1] + dy[k];
if (x < 0 || y < 0 || x >= map.length || y >= map[0].length) continue;
if (map[x][y] != 'X' && visited[x][y] == -1) {
visited[x][y] = visited[now[0]][now[1]] + 1;
if (map[x][y] == search)
return visited[x][y];
queue.add(new int[]{x, y});
}
}
}
return -1;
}
}