본문 바로가기
알고리즘

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

by limew 2023. 5. 27.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

const dirMap = {
    N: {
        row: -1,
        col: 0,
    },
    E: {
        row: 0,
        col: 1,
    },
    S: {
        row: 1,
        col: 0,
    },
    W: {
        row: 0,
        col: -1,
    },
};

function getNextPos(park, curr, route) {
    const [direction, step] = route.split(' ');
    const max = {
        row: park.length-1 ,
        col: park[0].length-1,
    }
    
    // 1스탭씩 이동
    for (let i = 0; i < step; i++) {
        const [r, c] = [curr[0] + dirMap[direction].row, curr[1] + dirMap[direction].col]; //
        // 장애물 있는지, 맵 안에 있는지 확인
        // if (park[r][c] === undefined || park[r][c] === 'X') { // 런타임에러 배열의 인덱스가 유효하지 않을때
        if (r < 0 || c < 0 || r > max.row || c > max.col || park[r][c] === 'X') {
            // 원래 자리로 돌려놓기
            return;
        }
        // 이동가능하면 이동
        curr = [r, c];
    }
    return curr;
}

function solution(park, routes) {
    var answer = [];
    // 시작점 찾기
    const startRow = park.findIndex(str => str.includes('S'));
    const startCol = [...park[startRow]].findIndex(c => c === 'S');
    let curr = [startRow, startCol];
    
    for (const route of routes) {
        const nextPos = getNextPos(park, curr, route);
        // 다음 포지션이 있음 이동
        if (nextPos) {
            curr = nextPos;
        }
    }
    answer = curr;
    return answer;
}

 

// array.findIndex (string X)
// array.find
// parseInt(str)
// let nextPos = null;

// 런타임 에러 !== 시간초과
// 1. 배열 undefined
// 2. max.row = park.lenth - 1