안녕하세요

프로그래머스 JS [공원 산책] 본문

카테고리 없음

프로그래머스 JS [공원 산책]

sakuraop 2023. 5. 9. 13:05

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 요약


["방향 거리", "방향 거리" … ]
주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행

["SOO","OXX","OOO"] S:스타트, X:장애물

 

풀이:

시작시점 구하기

이동하는 과정에서 park를 넘어서거나 벽이 있다면 이동하지 않기

문제가 없다면 이동하기

이동한 결과 반환하기


function solution(park, routes) {
  // 이동 구현
  const cor = { E: [0, 1], S: [1, 0], W: [0, -1], N: [-1, 0] };
  
  const move = (at, direction, distance) => {
    const start = [...at];
    let flag = true;
    for (let i = 0; i < distance; i++) {
      at[0] += cor[direction][0];
      at[1] += cor[direction][1];
      
      // 장애물이나 벽에 막힘 구현
      if (at[0] < 0 || at[1] < 0 || at[0] > park.length - 1 || at[1] > park[0].length - 1) {
        flag = false;
        break;
      }
      if (park[at[0]][at[1]] == "X") {
        flag = false;
        break;
      }
    }

    if (flag) {
      return at;
    }
    // 이동에 실패하였다면 원래 위치 반환
    return start;
  };

  let at = [0, 0];

  // 시작 위치 찾기
  for (let i = 0; i < park.length; i++) {
    for (let j = 0; j < park[0].length; j++) {
      if (park[i][j] === "S") {
        at[0] = i;
        at[1] = j;
      }
    }
  }

  // 이동정보 입력
  for (const route of routes) {
    const direction = route.split(" ")[0];
    const distance = route.split(" ")[1];
    at = move(at, direction, distance);
  }
  return at;
}