Programmers Algorithm - 공원산책

Myung Jin Kim·2023년 9월 3일
0

n*n 배열을 주고 시작지점에서 routes 에 따라 움직이는 알고리즘인데 하나 주의할 점이 있다면 갈 수 있는 곳이 있고 갈 수 없는 곳이 있다.

편의를 위해 n*n 만들 때, 각각의 item 들은 x, y 좌표와 v 를 가지는 Object 로 배열을 재구성했고,

routes 에 따라 움직이면서 user 의 좌표를 이동시켜주게끔 로직을 작성했다.

function solution(park, routes) {
    let user = {x: null, y: null};
    const rePark =
          park.map((parkPart, y) => parkPart.split('').map((parkPartValue, x) => {
              if(parkPartValue === 'S') {
                  user.x = x; user.y = y;
              }
        return {y, x, v: parkPartValue};
    }));

    routes.forEach(route => {
        const [op, n] = route.split(' ');
        const tempUser = {...user};
        let hasBlock = false;
        Array.from({length: n}, (_, index) => {
            switch(op) {
                case 'N':
                    tempUser.y -= 1;
                    break;
                case 'S':
                    tempUser.y += 1;
                    break;
                case 'W':
                    tempUser.x -= 1;
                    break;
                case 'E':
                    tempUser.x += 1;
                    break;
            }
            const movedPosition = rePark[tempUser.y]?.[tempUser.x] ?? null;
            if(!movedPosition) {
                hasBlock = true;
                return;
            }
            if(movedPosition.v === 'X') {
                hasBlock = true;
                return;
            }            
        });
        if(!hasBlock) {
            user = {...tempUser};
        }
    });

    return [user.y, user.x];
}

처음 잘못 생각했던 부분이 있었다.
routes 에 따라 움직이는 길 중 하나라도 못 가는 길이 있으면 해당 route 를 무시해야 하는 조건이 있었는데, 이를 한칸씩 움직이면서 못 가는 칸인지 확인하지 않고 한 번에 이동한 후, 해당 칸이 못 가는 칸인지 확인을 해서 테스트 케이스를 실패했다

다른 사람들이 푼 로직을 살펴보긴 했는데 분기문 및 로직이 생각보다 눈에 안들어와서 시간을 두고 천천히 다시 살펴봐야겠다.

재미있는 부분이 있었다면 각 방향을 switch 문으로 풀었던 부분을 다른 사람들은 미리 Object 로 정의해두고 가져다 쓰는 부분이 좀 더 가독성이 좋아보였다.

const OP_MAP = {
  N : [0, -1],
  S : [0, +1],
  W : [-1, 0],
  E : [+1, 0],
}
profile
개발을 취미로 하고 싶은 개발자를 목표로 살고 있습니다

0개의 댓글