로봇 강아지가 주어진 명령에 따라 직사각형 공원에서 산책을 합니다. 공원은 'O' (이동 가능), 'X' (장애물), 'S' (시작 지점)으로 구성된 격자 형태입니다. 로봇 강아지는 주어진 명령을 순서대로 수행하며, 각 명령은 방향 ('N', 'S', 'E', 'W')과 거리로 구성됩니다. 명령을 수행하기 전에, 로봇 강아지는 다음을 확인합니다:
이동하려는 방향이 공원을 벗어나는지.
이동 경로에 장애물이 있는지.
이 두 조건 중 하나라도 충족하면 해당 명령은 무시되고, 다음 명령으로 넘어갑니다. 모든 명령을 수행한 후 로봇 강아지의 최종 위치를 반환합니다.
제약사항
공원의 크기는 3x3 이상, 50x50 이하
명령의 길이는 1 이상, 50 이하
명령의 거리는 1 이상, 9 이하
2. 해결 방법
1. 공원의 정보를 받아 어디서 출발하는지, 어떤 지점에 장애물이 있는지 여부를 확인합니다.
a. 출발지점 찾기
b. 문자열 배열을 2D Matrix로 변환
2. 명령을 파싱하여 하나씩 처리한다.
3. 명령 처리 과정
- 명령을 파싱하여 방향(way)과 거리(length)를 추출
- 주어진 방향으로 하나씩 이동하면서 경계와 장애물을 확인
- 경계나 장애물을 만나면 해당 명령을 중단하고 다음 명령으로 넘어간다.
- 이동이 성공적으로 완료되면 해당 위치를 로봇의 위치로 업데이트
4. 모든 명령을 처리한 후 최종 위치를 반환
3. 풀이 코드
// 공원 배열에서 시작 지점 'S'의 좌표를 찾는 코드
// 이중 for문을 사용하여 각 행(row)을 검사하고, 'S'가 있는 열(column)의 인덱스를 찾고,
// 찾으면 [행, 열] 형태의 배열을 반환한다.
function findStartPosition(park) {
for (let i = 0; i < park.length; i++) {
const row = park[i];
const j = row.indexOf('S');
if (j !== -1) {
return [i, j];
}
}
return null;
}
function solution(park, routes) {
let startPosition = findStartPosition(park);
const parkMatrix = park.map(row => row.split(''));
routes.forEach((route) => {
let [i, j] = startPosition;
const way = route.split(" ")[0];
const length = route.split(" ")[1];
for (let step = 1; step <= length; step++) {
if (way === 'E') j += 1;
if (way === 'W') j -= 1;
if (way === 'S') i += 1;
if (way === 'N') i -= 1;
// 경계 체크
if (i < 0 || i >= parkMatrix.length || j < 0 || j >= parkMatrix[0].length) {
break;
}
// 장애물 체크
if (parkMatrix[i][j] === 'X') {
break;
}
if (step == length) startPosition = [i, j];
}
});
return startPosition;
}