๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿง  ์•Œ๊ณ ๋ฆฌ์ฆ˜

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]๋ฏธ๋กœ ํƒˆ์ถœ JS

by megan07 2024. 1. 4.

๋ฌธ์ œ๋งํฌ

 

์ „ํ˜•์ ์ธ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ฐพ๋Š” bfs ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค
์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ 2๋ฒˆ ์ฐพ์•„์•ผ ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค

ํŠน์ • ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ

1. ์ž…๊ตฌ์—์„œ ๋ ˆ๋ฒ„๊นŒ์ง€ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ 
2. ๋ ˆ๋ฒ„์—์„œ ์ถœ๊ตฌ๊นŒ์ง€ ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค

 

function solution(maps) {
    const r_length = maps.length;
    const c_length = maps[0].length;
    const dr=[0,0,-1,1];
    const dc = [1,-1, 0,0];
    
    let visited = Array.from(new Array(r_length), ()=> new Array(c_length).fill(false));
    let q=[];
    
    let start;
    let lever;
    let end;
    let min_cnt=0;
    
    //์‹œ์ž‘, ์ถœ๊ตฌ, ๋ ˆ๋ฒ„ ์œ„์น˜ ๊ตฌํ•˜๊ธฐ
    for(let r=0;r<r_length;r++){
        for(let c=0;c<c_length;c++){
            if(maps[r][c]==='S') start=[r, c];
            if(maps[r][c]==='E') end=[r,c];
            if(maps[r][c]==='L') lever=[r,c];
        }
    }
    
    //์ตœ๋‹จ๊ฑฐ๋ฆฌ bfs
    //์ถœ๋ฐœ์ง€์ ์—์„œ ๋ ˆ๋ฒ„๊นŒ์ง€ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
    q.push({pos:start, cnt:0});
    visited[start[0]][start[1]]=true;
    
    //๋ ˆ๋ฒ„๊นŒ์ง€ ๋„๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋ฉด -1
    if(!find_route('L')) return -1;
    
    //๋ ˆ๋ฒ„์—์„œ ์ถœ๊ตฌ๊นŒ์ง€ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
    q.push({pos:lever, cnt:0});
    visited[lever[0]][lever[1]]=true;
    
    //์ถœ๊ตฌ๊นŒ์ง€ ๋„๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋ฉด -1
    if(!find_route('E')) return -1;
    
    function find_route(finish){
        
        //bfs๋กœ ๊ตฌํ•˜๊ธฐ
        //q๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
         while(q.length){
            const {pos, cnt}=q.shift();
            const current_r=pos[0];
            const current_c =pos[1];
         
            //๋ชฉ์ ์ง€๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด min_cnt ์—…๋ฐ์ดํŠธํ•˜๊ณ  q๋ž‘ visited ๋ฐฐ์—ด ๋‹ค์‹œ ์„ค์ •
            if(maps[current_r][current_c]===finish){
                min_cnt+=cnt;
                q=[];
                visited=Array.from(new Array(r_length), ()=> new Array(c_length).fill(false));
                return true;
            }

            for(let i=0;i<4;i++){
                const next_r  = current_r+dr[i];
                const next_c = current_c+dc[i];

                //๋ฒฝ์ด ์•„๋‹ˆ๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ํ†ต๋กœ๋งŒ ํ์— ๋„ฃ๊ธฐ
                if(next_r>=0&&
                  next_r<r_length&&
                  next_c>=0&&
                  next_c<c_length&&
                  maps[next_r][next_c]!=='X'&&
                   !visited[next_r][next_c]
                  ){
                    q.push({pos:[next_r, next_c], cnt:cnt+1});
                    visited[next_r][next_c]=true;
                }
            }
        
        }
        return false;
    }
    
   
    return min_cnt;
   
}