코딩테스트

[프로그래머스/javascript] 게임맵 최단거리 (시간나면 다시풀기)

_서리__ 2023. 3. 7. 14:34
function solution(maps) {
    var answer = 0;
    const n =maps.length;
    const m = maps[0].length;
    let dy =[-1,1,0,0]
    let dx = [0,0,-1,1]
    let queue = [[0,0]]
    let visited = {};
    let result = [];
    let counted = [];
    function dfs(current,count){
        if(current[0]===n-1&&current[1]===m-1) counted.push(count)
        visited[current] = true;
        result.push(current)
        for(let i=0;i<4;i++){
            let ny = current[0]+dy[i]
            let nx = current[1]+dx[i]
            if(ny>=0&&nx>=0&&ny<n&&nx<m&& maps[ny][nx]===1&&!visited[[ny,nx]]){
                visited[[ny,nx]] = true;
                dfs([ny,nx],count+1);
                visited[[ny,nx]] = false;
            }
        }
    }
    dfs([0,0],1)

처음에 dfs로 풀었는데 답은 맞았지만 런타임에러가 떴다. 최단거리는 bfs로 풀어야한다는 것은 알고 있었는데....

bfs로 어떻게 풀어야 할지 감이 잡히지 않아 dfs로 풀었었다.

function solution(maps) {
    var answer = 0;
    const n =maps.length;
    const m = maps[0].length;
    let dy =[-1,1,0,0]
    let dx = [0,0,-1,1]
    let queue = [[0,0,1]]
    let visited = {};
    while(queue.length!==0){
        let [x,y,count] = queue.shift();
        let current = [x,y];
        if(current[0]===n-1&&current[1]===m-1) return count
        visited[current] = true;
        for(let i=0;i<4;i++){
            let ny = current[0]+dy[i]
            let nx = current[1]+dx[i]
            if(ny>=0&&nx>=0&&ny<n&&nx<m&& maps[ny][nx]===1&&!visited[[ny,nx]]){
                queue.push([ny,nx,count+1])
                visited[[ny,nx]] = true;
            }
        }
    }

    return -1
}

bfs로 푼 풀이