[JS][프로그래머스 -LEVEL 2 - 리코쳇 로봇]

정대만·2023년 8월 1일

코딩테스트

목록 보기
37/51
post-thumbnail

문제해설

  • 한 방향을 정하고 그쪽으로 계속 가야된다.
  • 더이상 갈수 있는 곳이 없을때 그곳에서 다시 출발해야된다.

나의 실수

한 시간동안 고민하다가 안되겠다 싶어서 dfs 개념도 다시보고 그랬다..
방향을 정해서 그쪽으로 갈때 > 가는 곳마다 다 체크를 놔뒀더니 . 결론적으로 체크를 다시 풀어줘야되는 문제점이 생겼다.

  • 이 문제점에 대해서 dfs 로 푼다음 하나의 체크배열 전체를 사용하는것이 아닌 dfs 가 시작하는 순간 check 배열를 다시 생성한후 가야되나? 싶었다.
  • 체크를 푸는 과정도 자꾸 에러가 났고 체크 배열을 생성하는데 뭔가 아닌듯 싶어서 남의 코드를 봣다.

남의 코드

  • 여기서는 내가 가는 곳 마다 체크를 두는게 아니라 실행했던 곳만 체크를 둬서 안된다고 표시하면 되는거였다. -> 결국 이 노드는 예전에 실행했던 적이 있어요를 다시 알려주는 문제다,.

코드

function solution(board) {
    var answer = 0;
    //가로길이
    var xLen = board[0].length;
    //세로길이
    var yLen = board.length;
      

    var startCor
    board = board.map((element)=>element.split(""));
    board.forEach((element,index)=>{
       for(var i =0;i<element.length;i++){
        if(element[i]==="R"){
            // x,y 순서 [1,3]
            startCor= [i,index];
            break;
        }
       } 
    });

    var queue = [startCor];
    board[startCor[1]][startCor[0]] = "C";

    var moveX = [1,-1,0,0];
    var moveY = [0,0,1,-1];

    while(queue.length!==0){

        const size = queue.length;

        for(var i = 0;i<size;i++){
            let[x,y] = queue.shift();
            
            for(var moveI =0;moveI<4;moveI++){
                var dx = x + moveX[moveI];
                var dy = y + moveY[moveI];
                while(dx>=0 && dy>=0 && dx<xLen&& dy<yLen && board[dy][dx]!=="D"){
                    dx += moveX[moveI];
                    dy += moveY[moveI];
                }

                dx -= moveX[moveI];
                dy -= moveY[moveI];

                if(board[dy][dx] === "G"){
                    return answer+1;
                }
                else if(board[dy][dx] !== "C"){
                    board[dy][dx] = "C";
                    queue.push([dx,dy]);
                }
            }
        }
        answer++;

    }    
    return -1;
}

profile
안녕하세요

0개의 댓글