https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
미로를 탈출하는데 레버에 먼저 들리고 출구로 가야한다.
즉, 출발지 -> 레버, 레버 -> 출구 2차례 그래프 탐색으로 최솟값을 구하면 된다.
bfs탐색을 통해 두 함수의 최솟값을 구해줬다.
메모리: 77.3MB
시간: 0.42ms
언어: Java 11
import java.util.*;
class Solution {
static class Point {
int r;
int c;
int time;
public Point(int r, int c, int time) {
this.r = r;
this.c = c;
this.time = time;
}
}
static char[][] board;
static int answer;
static int[][] vector = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };
public int solution(String[] maps) {
board = new char[maps.length][maps[0].length()];
int sr = 0;
int sc = 0;
for (int i = 0; i < maps.length; i++) {
for (int j = 0; j < maps[0].length(); j++) {
board[i][j] = maps[i].charAt(j);
if (board[i][j] == 'S') {
sr = i;
sc = j;
}
}
}
answer = findRoute(sr, sc, 'L');
return answer;
}
private static int findRoute(int r, int c, char goal) {
Queue<Point> queue = new LinkedList<>();
boolean[][] visit = new boolean[board.length][board[0].length];
visit[r][c] = true;
queue.add(new Point(r, c, 0));
while (!queue.isEmpty()) {
Point curr = queue.poll();
if (board[curr.r][curr.c] == goal) {
if (goal == 'L') {
int f = findRoute(curr.r, curr.c, 'E');
if (f == -1) {
return -1;
} else {
return curr.time + f;
}
} else {
return curr.time;
}
}
for (int i = 0; i < 4; i++) {
int nr = curr.r + vector[i][0];
int nc = curr.c + vector[i][1];
if (nr < 0 || nc < 0 || nr >= board.length || nc >= board[0].length || board[nr][nc] == 'X'
|| visit[nr][nc]) {
continue;
}
queue.add(new Point(nr, nc, curr.time + 1));
visit[nr][nc] = true;
}
}
return -1;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 카드 짝 맞추기 - JAVA (0) | 2024.05.18 |
---|---|
[프로그래머스] 파괴되지 않은 건물 - JAVA (0) | 2024.05.18 |
[프로그래머스] 광고 삽입 - JAVA (0) | 2024.05.18 |
[프로그래머스] 블록 이동하기 - JAVA (0) | 2024.05.17 |
[프로그래머스] 마법의 엘리베이터 - JAVA (0) | 2024.05.17 |
[프로그래머스] [카카오 인턴] 경주로 건설 - JAVA (0) | 2024.05.12 |