Level 2️⃣ - 리코쳇 로봇

2024. 4. 25. 15:20알고리즘/프로그래머스

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

 

프로그래머스

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

programmers.co.kr

🚀문제 접근

bfs 탐색을 생각할 수 있는데 장애물을 만나거나 범위에 벗어날 때까지는 쭉 미끄러져야한다.

이 부분을 구현하는 것이 어려웠다.

그리고 항상 visited 배열을 이용해서 최단거리를 구했는데 count라는 변수를 이용해서 목적지점까지의 최단거리를 구할 수 있다.

조금 변형되어도 스스로 느끼기에 난이도가 확 높아진 느낌이다. 더 많은 문제를 풀어봐야겠다.

function solution(board) {
    let answer = -1;
    const map = board.map((item)=> item.split(""));
    const n = map.length;
    const m = map[0].length;
    const visited = Array.from({length: n}, ()=>Array.from({length: m}).fill(0));
    const dy = [-1, 0, 1, 0];
    const dx = [0, 1, 0, -1];
    // 시작 지점 찾기
    let sy, sx;
    for(let i = 0; i<n; i++){
        for(let j = 0; j<m; j++){
            if(map[i][j] === 'R'){
                sy = i;
                sx = j;
            }
        }
    }
    // bfs 탐색
    const queue = [[sy, sx, 0]];
    visited[sy][sx] = 1;
    while(queue.length){
        const [y, x, count] = queue.shift();
        if(map[y][x] === 'G'){
            answer = count;
            break;
        }
        for(let i = 0; i<4; i++){
            let ny = y + dy[i];
            let nx = x + dx[i];
            // 미끄러지기
            while(ny>=0 && ny<n && nx>=0 && nx<m && map[ny][nx] !=='D'){
                ny += dy[i];
                nx += dx[i];
            }
            // 장애물을 만나거나 범위에 벗어났을 때는 빠꾸
            ny -= dy[i];
            nx -= dx[i];
            // 해당 지점을 방문하지 않았을 때는 방문처리하고 큐에 집어넣어서 이 지점을 기준으로 다시 탐색
            if(!visited[ny][nx]){
                queue.push([ny, nx, count+1]);
                visited[ny][nx] = 1;
            }
        }
    }
    
    return answer;
}