📍문제 링크
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로 넘어가야 하기 때문이다