| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 다이나믹프로그래밍
- lv2
- BFS
- 컴퓨터 비전
- 컴퓨터비전
- cpp
- 백준
- 2018 KAKAO BLIND RECRUITMENT
- level3
- dfs
- 임베디드
- 자바
- 다이나믹 프로그래밍
- 누적합
- c++
- 구현
- level2
- kotlin
- 그리디
- Stack
- 통신 인터페이스
- 동적계획법
- 코틀린
- 우선순위큐
- 프로그래머스
- 이분탐색
- dp
- C
- JavaScript
- java
Archives
- Today
- Total
코드를 느껴바라
Lv.2 미로 탈출 [JAVA] 본문
문제 링크
성공 여부(걸린 시간): 성공(34분 37초)
아이디어
이 문제는 레버를 먼저 작동시켜야 탈출이 가능한 구조이기 때문에 레버를 출발지점으로 생각해서
S를 향해 한번, E를 향해 한번 BFS를 총 두 번 수행하는 방식으로 해결할 수 있다.
- 레버 위치를 기준점으로 두고 BFS를 두 번 수행한다.
- 첫 번째 BFS: 레버에서 시작점(
S)까지의 거리 - 두 번째 BFS: 레버에서 도착점(
E)까지의 거리
- 첫 번째 BFS: 레버에서 시작점(
- 두 거리의 합이 곧 정답이 되며, 이 중 하나라도 도달하지 못하면(
-1반환) 탈출이 불가능한 경우이므로-1을 반환한다.
핵심 구현 포인트
- BFS를 위한 visited 배열 초기화
- 레버 위치부터 S, E까지 각각 도달 가능 여부 및 거리 계산
- 도달하지 못한 경우 -1 반환
정답 코드
import java.util.*;
class Solution {
static int N, M;
static int [][] map;
static int [] button;
public int solution(String[] maps) {
N = maps.length;
M = maps[0].length();
int [] startPoint = {0, 0};
int [] endPoint = {0, 0};
button = new int[]{0, 0}; // 레버 위치
map = new int[N][M];
// 맵 기호 처리: S=0, E=1, O=2, X=3, L=-1
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
char x = maps[i].charAt(j);
if(x == 'S'){
map[i][j] = 0;
startPoint = new int[]{i, j};
} else if(x == 'E'){
map[i][j] = 1;
endPoint = new int[]{i, j};
} else if(x == 'O'){
map[i][j] = 2;
} else if(x == 'X'){
map[i][j] = 3;
} else if(x == 'L'){
map[i][j] = -1;
button = new int[]{i, j};
}
}
}
int getToS = BFS(startPoint);
int getToE = BFS(endPoint);
if(getToS != -1 && getToE != -1){
return getToS + getToE;
}
return -1;
}
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0};
static int BFS(int[] target){
int[][] visited = new int[N][M];
for(int i = 0; i < N; i++){
Arrays.fill(visited[i], -1);
}
ArrayDeque<int[]> q = new ArrayDeque<>();
q.add(new int[]{button[0], button[1]});
visited[button[0]][button[1]] = 0;
while(!q.isEmpty()){
int[] cur = q.poll();
int x = cur[0], y = cur[1];
if(x == target[0] && y == target[1]){
return visited[x][y];
}
for(int i = 0; i < 4; i++){
int mx = x + dx[i];
int my = y + dy[i];
if(canGo(mx, my) && visited[mx][my] == -1 && map[mx][my] != 3){
q.add(new int[]{mx, my});
visited[mx][my] = visited[x][y] + 1;
}
}
}
return -1;
}
static boolean canGo(int x, int y){
return x >= 0 && y >= 0 && x < N && y < M;
}
}반응형
'PS > 프로그래머스(Programmers)' 카테고리의 다른 글
| Lv.2 롤케이크 자르기 [JAVA] (4) | 2025.08.17 |
|---|---|
| Lv.3 등대 [JAVA] (5) | 2025.08.02 |
| Lv.2 숫자 변환하기 [JAVA] (4) | 2025.07.30 |
| Lv.2 귤 고르기 [JAVA] (4) | 2025.07.26 |
| Lv.2 뒤에 있는 큰 수 찾기 [JAVA] (2) | 2025.07.20 |
