TIL

TIL) 프로그래머스 공원산책

tmddnr3503 2024. 11. 18. 21:20

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. 내일 해야할 일

  • 발제 보고 회의하기