TIL) 프로그래머스 공원산책
1. 문제 상황
공원의 길이 String의 배열로 주어고, 가야하는 길이 String의 배열로 주어집니다. 예시로 아래와 같습니다.
- 공원의 길 "OOOOO", "OOOOO", "OOSOO", "OOOOO", "OOOOO"
- 이동 방향 "E 3", "W 3", "S 3", "N 3", "E 2", "E 1", "W 4", "W 1", "S 2", "S 1", "N 4", "N 1"
O는 갈수 있는길 S는 시작지점, X는 갈 수 없는 길입니다. 만일 이동 방향에 갈 수 없는 길 혹은 지도를 나가게 된다면 이동을 하지 않습니다.
2. 공원의 길을 변환
공원의 길을 문자열이 아닌 int형 2차원 배열로 변환해서 선언해줍니다. 이때, 시작점은 1, 갈 수 있는 길은 0, 갈 수 없는 길은 -1로 표시해 줍니다.
int row = 0, col = 0;
//S -> 1, O ->0, X -> -1 벽 -> -1
int[][] maps = new int[park.length][park[0].length()];
for (int i = 0; i < park.length; i++) {
for (int j = 0; j < park[0].length(); j++) {
if (park[i].charAt(j) == 'O') {
maps[i][j] = 0;
}else if(park[i].charAt(j) == 'S'){
maps[i][j] = 1;
row = i;
col = j;
}else{
maps[i][j] = -1;
}
}
}
3. 좌표를 이동하기
공원에서 시작위치 1을 row와 col에 저장하였습니다. 앞으로 이동한 후의 위치를 moveRow, moveCol이라고 하고 주어진 String배열에서 위치값을 찾는 연산을 해줍니다.
int moveRow = row;
int moveCol = col;
switch (routes[i].charAt(0)) {
case 'E':
moveCol = col + routes[i].charAt(2) - '0';
break;
case 'W':
moveCol = col - (routes[i].charAt(2) - '0');
break;
case 'S':
moveRow = row + (routes[i].charAt(2) - '0');
break;
case 'N':
moveRow = row - (routes[i].charAt(2) - '0');
break;
}
이때, 좌우는 col로 움직이고, 상하는 row로 움직입니다. 또한 현재 움직여야하는 칸수는 String형태로 있으므로 int형으로 변환해 줍니다. 그 후 moveRow와 moveCol에 대입하여 도착지점의 좌표를 표시해 줍니다.
4. 위치를 기반으로 이동해주는 함수를작성하기
private int[] move(int[][] maps, int row, int col, int moveRow, int moveCol){
boolean flag = true;
int bigRow = (row > moveRow) ? row : moveRow;
int bigCol = (col > moveCol) ? col : moveCol;
int smallRow = (row < moveRow) ? row : moveRow;
int smallCol = (col < moveCol) ? col : moveCol;
for(int i = smallRow; i <= bigRow ; i++){
if(moveRow > maps.length - 1 || moveCol > maps[0].length - 1 ||
moveRow < 0 || moveCol < 0){
flag = false;
break;
}else if(!flag){
break;
}
for(int j = smallCol; j <= bigCol; j++){
if(maps[i][j] == -1){
flag = false;
break;
}
}
}
if(flag){
maps[row][col] = 0;
maps[moveRow][moveCol] = 1;
}else{
moveRow = row;
moveCol = col;
}
return new int[]{moveRow, moveCol};
}
이때, W혹은 N으로 이동해도 for문을 빠져나가는 것을 막기위해 bigRow, smallRow, bigCol, smallCol을 찾아서 반복해줍니다. 갈 수 없는 위치인지, 가는 길에 이동 불가능한 길이 있는지를 확인한 후 최종 위치를 반환해줍니다. 만일 갈 수 없는 곳이라면 현재위치를 반환해줍니다.
5. 어려웠던 점
어려웠던 부분이 처음 row, col을 사용하지 않고, x, y로 사용할 때, x와 y의 위치가 반대가 되서 위치를 파악하고 증감을 하기 어려웠습니다. 그 후 row, col로 바꾸었더니 더 쉽게 해결할 수 있었습니다.
6. 내일 해야할 일
- 발제 보고 회의하기