추가된 1단계 문제중 가장 정답률이 낮은 문제였다.
전형적인 그래프 탐색 문제였는데, 한칸씩 이동하며 조건을 검사해야 했지만
한번에 n칸씩 이동한다는걸 뒤늦게 깨닫고 수정하느라 풀이 시간이 많이 늘어났다.
최종 코드
import java.util.*;
class Solution {
static int startX;
static int startY;
public int[] solution(String[] park, String[] routes) {
int[] answer = new int[2];
// 동서남북 이동할 좌표 map에 삽입
Map<String, int[]> map = new HashMap<>();
map.put("N", new int[]{-1, 0});
map.put("E", new int[]{0, 1});
map.put("S", new int[]{1, 0});
map.put("W", new int[]{0, -1});
startX = 0;
startY = 0;
// park 2차원 배열로 만들며 시작 위치 탐색
String[][] arr = new String[park.length][park[0].length()];
for(int i=0; i < park.length; i++) {
String[] temp = park[i].split("");
for(int j=0; j < temp.length; j++) {
arr[i][j] = temp[j];
if(temp[j].equals("S")) {
startX = i;
startY = j;
}
}
}
// routes를 순회하며 move 메서드 호출
for(int i = 0; i < routes.length; i++) {
String[] temp = routes[i].split(" ");
int[] movePoint = map.get(temp[0]);
move(arr, startX, startY, movePoint, Integer.parseInt(temp[1]));
}
answer[0] = startX;
answer[1] = startY;
return answer;
}
// 재귀를 이용한 탐색 메서드
public void move(String[][] arr, int x, int y, int[] movePoint, int cnt) {
// 경로가 모두 이동 가능한 길이었다면 startX, startY에 이동 좌표 추가
if(cnt == 0) {
startX = x;
startY = y;
return;
}
// 한칸씩 이동하며 경로 탐색
int nextX = x + movePoint[0];
int nextY = y + movePoint[1];
// 2차원 배열을 벗어나지 않으면서 X가 아니면 재귀 호출
if(nextX >= 0 && nextX < arr.length && nextY >= 0 && nextY < arr[0].length) {
if(!arr[nextX][nextY].equals("X")) {
move(arr, nextX, nextY, movePoint, cnt - 1);
}
}
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 - 뒤에 있는 큰 수 찾기 (0) | 2023.05.04 |
---|---|
(Java) 프로그래머스 - 연속 부분 수열 합의 개수 (0) | 2023.04.28 |
(Java) 프로그래머스 - 개인정보 수집 유효기간 (0) | 2023.04.25 |
(Java) 백준 15652 - N과 M (4) (0) | 2023.02.17 |
(Java) 프로그래머스 - 둘만의 암호 (0) | 2023.02.16 |