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

Lenny·2023년 8월 28일
0

문제

풀이

function solution(park, routes) {
  
    const maxRow = park.length - 1;
    const maxCol = park[0].length - 1;
    
    let row = park.findIndex((s) => s.includes("S")); // H
    let col = park[row].indexOf("S"); // W

    routes.forEach((position) => {
        const [d, n] = position.split(" ");
        
        let tempRow = row; // 복사한 현재 위치 (H)
        let tempCol = col; // 복사한 현재 위치 (W)
        let flag = true;
        
        for (let i = 0; i < Number(n); i++) {
            
            if (d === "E") tempCol++;
            else if (d === "W") tempCol--;
            else if (d === "S") tempRow++;
            else if (d === "N") tempRow--;
        
            if(tempRow > maxRow ||
               tempRow < 0 || 
               tempCol > maxCol || 
               tempCol < 0 || 
               park[tempRow][tempCol] === "X") {
                flag = false;
                break;
            }
        }
    
        if (flag) {
            col = tempCol;
            row = tempRow;
        }
        
    })

    
    return [row, col];
}

이번 문제는 스스로 해결을 못하였기때문에.. 이번 포스팅에서는 다른 사람의 코드를 나의 이해를 토대로 해석합니다!

    const maxRow = park.length - 1;
    const maxCol = park[0].length - 1;

공원의 공간을 구하는 코드임당.
공원의 공간을 구하는 이유는 현재 위치가 공원을 벗어나는지를 알기 위함입니당.
그리고 -1을 하는 이유는 문제에 언급된 "우측 하단의 좌표는 (H - 1, W - 1) 입니다." 때문인 것 같습니다. 아마 인덱스 측면에서 생각을 하면 될 것 같습니다.

우리가 봤을때 길이가 4인 배열도 인덱스로 접근하려면 0,1,2,3 으로 접근하는것과 같은 ..? 의미인 것 같습니다.

    let row = park.findIndex((s) => s.includes("S")); // H
    let col = park[row].indexOf("S"); // W

시작 위치의 좌표를 구하는 코드입니다.
(row, col) 순서쌍으로 이해하면 됩니다.

   routes.forEach((position) => {
        const [d, n] = position.split(" ");
        
        let tempRow = row; // 복사한 현재 위치 (H)
        let tempCol = col; // 복사한 현재 위치 (W)
        let flag = true;
        
        for (let i = 0; i < Number(n); i++) {
            
            if (d === "E") tempCol++;
            else if (d === "W") tempCol--;
            else if (d === "S") tempRow++;
            else if (d === "N") tempRow--;
        
            if(tempRow > maxRow ||
               tempRow < 0 || 
               tempCol > maxCol || 
               tempCol < 0 || 
               park[tempRow][tempCol] === "X") {
                flag = false;
                break;
            }
        }
    
        if (flag) {
            col = tempCol;
            row = tempRow;
        }
        
    })

이번 문제 풀이의 핵심인 routes를 순회하면서 명령한 수행한 위치를 구하는 코드입니다.

const [d, n] = position.split(" ");

구조 분해 할당으로 방향을 나타내는 대문자를 d, 이동 칸수를 n에 할당합니다.

let tempRow = row; // 복사한 현재 위치 (H)
let tempCol = col; // 복사한 현재 위치 (W)
let flag = true;

순회하면서 현재 위치를 가르킬 임시 위치 tempRow, tempCol, 그리고 수행할 수 없는 명령을 표시할 flag 변수를 선언합니다.

        for (let i = 0; i < Number(n); i++) {
            
            if (d === "E") tempCol++;
            else if (d === "W") tempCol--;
            else if (d === "S") tempRow++;
            else if (d === "N") tempRow--;
        
            if(tempRow > maxRow ||
               tempRow < 0 || 
               tempCol > maxCol || 
               tempCol < 0 || 
               park[tempRow][tempCol] === "X") {
                flag = false;
                break;
            }
        }

n만큼 반복문을 돌면서 d에 해당하는 방향을 증가시킵니다. 연산 도중 현재 위치가 공간을 벗어나거나 X를 만난 경우 현재 명령을 취소합니다.

        if (flag) {
            col = tempCol;
            row = tempRow;
        }

for문을 돌면서 전혀 문제를 마주치지 않았다면 flag는 true 상태로 끝날 것이고, 이 때 col, row에 이동한 위치를 대입해줍니다.

profile
🧑‍💻

0개의 댓글