공원 산책 문제풀이
문자열 배열로 시작지점S, 장애물X이 표시된 공원 ex){"SOO","OOX","OOO"},
문자열 배열로 "E 1"과 같이 이동방향+공백+이동거리가 주어진 이동 명령 ex){"E 1","S 1"}이 주어질 때
길이 없거나 가는 길에 장애물이 있는 경우 명령을 무시하고 다음 명령을 수행한다면
최종 도착지를 int[]로 반환
public int[] solution(String[] park, String[] routes) {
int[] position= new int[2];//S 찾아서 바꿔줘
for (int i = 0; i < park.length; i++) {//시작위치 설정
if(park[i].contains("S")) {
position[0] = i;
position[1] = park[i].indexOf("S");
break;
}
}
int[][] parkArr = new int[park.length][park[0].length()];
for (int i = 0; i < parkArr.length; i++) {
for (int j = 0; j < parkArr[0].length; j++) {
if(park[i].charAt(j)=='X')parkArr[i][j]=1;
}//park 정수행렬로 변경
}
for (int i = 0; i < routes.length; i++) {
if(isPossible(parkArr,position,routes[i]))position=move(position,routes[i]);
}
return position;
}
public boolean isPossible(int[][] parkArr, int[] position, String route) {
String direction = route.split(" ")[0];
int distance = Integer.valueOf(route.split(" ")[1]);
//장애물이 있는지, 길이 있는지
if(direction.equals("E")) {
if(position[1]+distance>parkArr[0].length-1)return false;
for (int i = 1; i <= distance; i++) {
if(parkArr[position[0]][position[1]+i]==1)return false;
}
}else if(direction.equals("W")) {
if(position[1]-distance<0)return false;
for (int i = 1; i <= distance; i++) {
if(parkArr[position[0]][position[1]-i]==1)return false;
}
}else if(direction.equals("N")) {
if(position[0]-distance<0)return false;
for (int i = 1; i <= distance; i++) {
if(parkArr[position[0]-i][position[1]]==1)return false;
}
}else if(direction.equals("S")) {
if(position[0]+distance>parkArr.length-1)return false;
for (int i = 1; i <= distance; i++) {
if(parkArr[position[0]+i][position[1]]==1)return false;
}
}
return true;
}
public int[] move(int[] position,String route) {
String direction = route.split(" ")[0];
String distance = route.split(" ")[1];
if(direction.equals("E")) {
position[1]+=Integer.valueOf(distance);
}else if(direction.equals("W")) {
position[1]-=Integer.valueOf(distance);
}else if(direction.equals("N")) {
position[0]-=Integer.valueOf(distance);
}else if(direction.equals("S")) {
position[0]+=Integer.valueOf(distance);
}
return position;
}
isPossible 로 이동 가능한지 확인 후 move로 이동을 수행한다.
String 배열로 주어진 park는 핸들링하기 편하게 int[][] 로 행렬로 바꾸어 준다.
isPossible은 길이 있는지, 있다면 가는 길에 장애물이 있는지 확인하여야 한다.