프로그래머스 < 공원 산책 > JavaScript

2023. 7. 3.·☕️ 커리어 & 인터뷰 준비/코딩 테스트

📍문제 링크

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

 

📍알고리즘 분류

- 구현

 

📍문제 풀이

N * M 크기의 2차원 배열 park가 주어진다. 이차원 배열은 하나의 S, 여러개의 O, X로 구성되어 있다

- S : 시작 좌표

- O : 이동 가능한 좌표

- X : 장애물 (이동 불가) 좌표

 

그리고 "E 2", "N 1" 처럼, 동서남북 방향과 이동거리가 원소인 배열 routes가 주어진다

 

routes 를 순회하며, route의 이동 결과가 N * M을 넘지 않고, 장애물을 만나지않을 경우에만 좌표를 움직인다

그리고 최종 결과를 출력한다

 

📍코드 (JavaScript)

const park = ["OSO", "OOO", "OXO", "OOO"];
const routes = ["E 2", "S 3", "W 1"];

function solution(park, routes) {
  const startPos = getStartPos(park);

  for (const route of routes) {
    if (isInPark(park, route, startPos)) movePos(park, route, startPos);
  }

  return startPos;

  function getStartPos(park) {
    const pos = [0, 0];
    for (let i = 0; i < park.length; i++) {
      for (let j = 0; j < park[i].length; j++) {
        if (park[i][j] === "S") {
          pos[0] = i;
          pos[1] = j;
          return pos;
        }
      }
    }
  }

  function isInPark(park, route, startPos) {
    const [direction, countStr] = route.split(" ");
    const count = +countStr;
    if (direction === "E") return startPos[1] + count <= park[0].length - 1;
    if (direction === "W") return startPos[1] - count >= 0;
    if (direction === "N") return startPos[0] - count >= 0;
    if (direction === "S") return startPos[0] + count <= park.length - 1;
  }

  function movePos(park, route, startPos) {
    const [direction, countStr] = route.split(" ");
    const count = +countStr;

    if (direction === "E") {
      for (let i = startPos[1]; i <= startPos[1] + count; i++) {
        if (park[startPos[0]][i] === "X") return;
      }
      startPos[1] += count;
    }
    if (direction === "W") {
      for (let i = startPos[1]; i >= startPos[1] - count; i--) {
        if (park[startPos[0]][i] === "X") return;
      }
      startPos[1] -= count;
    }
    if (direction === "N") {
      for (let i = startPos[0]; i >= startPos[0] - count; i--) {
        if (park[i][startPos[1]] === "X") return;
      }
      startPos[0] -= count;
    }
    if (direction === "S") {
      for (let i = startPos[0]; i <= startPos[0] + count; i++) {
        if (park[i][startPos[1]] === "X") return;
      }
      startPos[0] += count;
    }
  }
}

console.log(solution(park, routes)); // [0, 0]

 

📍리뷰

- movePos 함수가 실행하는 동작을 따로 분리한 이유는, 좌표 이동중에 장애물을 만나면, 이동을 취소하고 다음 route로 넘어가야 하기 때문이다

'☕️ 커리어 & 인터뷰 준비/코딩 테스트' 카테고리의 다른 글
  • 프로그래머스 < 요격 시스템 > JavaScript
  • 프로그래머스 < 개인정보 수집 유효기간 > JavaScript
  • 프로그래머스 < 삼총사 > JavaScript
  • 프로그래머스 < 달리기 경주 > JavaScript
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (516)
      • 🎨 프론트엔드 공부 (253)
        • JS & TS (92)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
프로그래머스 < 공원 산책 > JavaScript
상단으로

티스토리툴바