유형: 그래프 탐색
문제: 프로그래머스 - 공원 산책
문자열 배열로 이루어진 그리드 탐색문제이다. 기본적으로 상하좌우 탐색하는 문제인 줄 알았는데 맞긴한데 문제를 정말 잘 읽어야 한다...
제대로 문제를 읽지 않아 헤맸던 조건은
주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
이동했을 때 장애물이 있는지가 아닌, 이동하는 범위 내에 장애물이 있는지 확인해야 한다!
여기서 되게 헤맸다.
sh
sw
nh
nw
break
nh
nw
의 값을 sh
sw
에 대입한 칸씩 이동하면서 장애물을 확인한 이유
sh
sw
부터nh
nw
까지의 범위를 확인해야 하는데, 어떤 변수를 기준점으로 잡아야 하는지 동, 서, 남, 북에 따라 모두 달라지기 때문에 비슷한 코드를 4개 작성해야 하는 것을 원하지 않았음
class Solution {
public int[] solution(String[] park, String[] routes) {
int H = park.length; // 세로
int W = park[0].length(); // 가로
/*
시작 지점 찾기
*/
int sh = 0;
int sw = 0;
for (int i = 0; i < park.length; i++) {
if (park[i].contains("S")) {
sh = i;
sw = park[i].indexOf("S");
}
}
/*
산책
*/
for (String route : routes) {
int nh = sh;
int nw = sw;
int direction = route.charAt(0);
int move = Character.getNumericValue(route.charAt(2));
for (int i = 0; i < move; i++) {
if (direction == 'N') nh--;
if (direction == 'S') nh++;
if (direction == 'W') nw--;
if (direction == 'E') nw++;
if (nh >= 0 && nh < H && nw >= 0 && nw < W) { // 유효 범위
if (park[nh].charAt(nw) == 'X') break; // 이동 범위 내 장애물 유무
if (i == move-1) {
sh = nh;
sw = nw;
}
}
}
}
int[] answer = new int[2];
answer[0] = sh;
answer[1] = sw;
return answer;
}
}