Java/Coding Test

공원 산책 문제풀이

최고다최코딩 2023. 9. 24. 01:36
728x90

문자열 배열로 시작지점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은 길이 있는지, 있다면 가는 길에 장애물이 있는지 확인하여야 한다.