프로그래머스/Lv1

[프로그래머스/Javascript] Lv.1 공원 산책

woo.oing 2026. 1. 19. 14:23
 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

✓ 풀이과정

 

처음 시도한 풀이과정은 아래와 같습니다

 

1. 전달받은 park에서 width, height를 구하고 S의 좌표를 [y, x] 형태로 저장합니다.

2. routes 를 순회하며 1에서 저장했던 현재의 좌표에서 해당 방향으로 거리만큼 이동하는데

공원 크기를 넘어가거나, X를 발견하면 이동하지 않고, 조건을 통과하면 현재의 좌표를 이동한 좌표로 저장합니다

 

function solution(park, routes) {
  let answer = [];
  let w = park[0].length;
  let h = park.length;

  m: for (let i = 0; i < h; i++) {
    const parkY = park[i].split("");
    for (let j = 0; j < w; j++) {
      const parkX = parkY[j];
      if (parkX === "S") {
        answer = [i, j];
        break m;
      }
    }
  }

  mm: for (let i = 0; i < routes.length; i++) {
    const route = routes[i].split(" ");

    let y = answer[0];
    let x = answer[1];
    let way = route[0];
    let street = Number(route[1]);

    for (let j = 0; j < street; j++) {
      if (way === "E") x += 1;
      else if (way === "W") x -= 1;
      else if (way === "S") y += 1;
      else if (way === "N") y -= 1;

      if (y < 0 || y >= h || x < 0 || x >= w || park[y].split("")[x] === "X") {
        continue mm;
      }
    }

    answer = [y, x];
  }

  return answer;
}

 

1. 문자열을 불필요하게 split으로 배열형태로 변환하는 부분 개선

(js에서 문자열은 배열과 동일하게 str[n]의 형태로 접근 가능)

2. for문에 라벨을 붙여서 제어하는 방식 개선 ⭐️

3. 변수 선언은 구조 분해 할당 활용

4. 방향 if-else문 개선 ⭐️⭐️

 

여기서 4번 항목은 앞으로 2차원 배열 좌표 문제가 나왔을 때도 같은 방식으로 사용하게 될 것 같은데

방향마다 좌표를 별도의 객체로 저장해서 계산하면 효율적으로 계산할 수 있습니다

 

▪︎ 개선 전

if (way === "E") x += 1;
else if (way === "W") x -= 1;
else if (way === "S") y += 1;
else if (way === "N") y -= 1;

 

▪︎ 개선 후

let dir = {
    E: [0, 1],
    W: [0, -1],
    S: [1, 0],
    N: [-1, 0],
};
  
let [dirY, dirX] = dir[way];

y += dirY;
x += dirX;

 

 

방향별로 추가될 [y, x] 값을 저장해두고 현재 좌표에 해당 값을 더해서 이동하는 방식으로 변경했습니다

 

 

 최종코드

function solution(park, routes) {
  let answer = [];
  let w = park[0].length;
  let h = park.length;
  let dir = {
    E: [0, 1],
    W: [0, -1],
    S: [1, 0],
    N: [-1, 0],
  };

  const findStart = () => {
    for (let i = 0; i < h; i++) {
      for (let j = 0; j < w; j++) {
        if (park[i][j] === "S") return [i, j];
      }
    }
  };

  answer = findStart();

  const moveRoute = (answer, route) => {
    let [y, x] = answer;
    let [way, street] = route.split(" ");

    for (let j = 0; j < Number(street); j++) {
      let [dirY, dirX] = dir[way];
      y += dirY;
      x += dirX;

      if (y < 0 || y >= h || x < 0 || x >= w || park[y][x] === "X") {
        return;
      }
    }

    return [y, x];
  };

  for (const route of routes) {
    let newRoute = moveRoute(answer, route);
    if (newRoute) answer = newRoute;
  }

  return answer;
}

 

이차원 배열로 푸는 좌표 문제였는데 배열 좌표 문제 형태에 익숙하지 않아서 조건을 검증하는 과정에서 시간이 걸렸던 것 같습니다 1.5단계처럼 느껴졌는데 비슷한 유형의 문제에서 다음에는 어떤 식으로 접근해야 할지 조금은 감을 잡게 된 문제였습니다!