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

Clear·2023년 5월 3일
0

출처

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

풀이

설명

  • 일단, 엄밀히 말해서 bfs는 아닙니다. queue를 사용한 그리디 풀이에 가깝습니다.
  • 시작지점 "S"가 나오면 주어진 명령을 그대로 수행하는 로직(bfs)을 실행합니다. 이하, 설명은 주석으로 대체합니다.
const bfs = (i ,j, routes, park)=> {
    const delta = {
        N : [-1,0],
        S : [1,0],
        W : [0,-1],
        E : [0,1]
    }
    
    // [1]. routes 하나씩 뽑으면서 반복문
    while(routes.length > 0) {
        const [op, n] = routes.shift().split(' ')
        let [di, dj] = delta[op]
        let flag = true
        
        // [2]. 방향대로 한칸씩 움직이면서 유효하지 않은 명령이면 종료
        for (let k=1; k <= +n; k++) {
            const [ni, nj] = [i + di * k, j + dj * k];
            // [2-1]. JS에서는 index가 배열의 범위를 넘어가면 undefined가 할당되기 때문에, 
          	// 이런 식으로 조건문을 설정하는 것이 가능합니다.
            if (!park[ni] || !park[ni][nj] || park[ni][nj] === 'X') {
                flag = false
                break
            }
        }
        
        // [3]. 유효한 명령이었으면 이동
        if (flag) {
            i += di * +n
            j += dj * +n
        }
    }
    
    return [i, j]
}

function solution(park, routes) {
    var answer = [];
    const row = park.length;
    const col = park[0].length

    for (let i=0; i<row; i++) {
        for (let j=0; j<col; j++) {
            if (park[i][j]==='S') {
                return bfs(i, j, routes, park)
            }
        }
    }
}

배운것

  • JS에서는 index가 배열의 범위를 넘어가면 undefined가 할당되기 때문에,
  • visited배열 등 배열의 인덱스를 검사할 때, 이런 식으로 조건문을 설정하는 것이 가능하다.
if (!array[ni] || !array[ni][nj] || array[ni][nj] === 'X') {
	// visited 처리, 재귀호출 등등 실행할 로직..
}
        

0개의 댓글