๐Ÿ”’Algorithm

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[JS] > ๋ฆฌ์ฝ”์ณ‡ ๋กœ๋ด‡

devWarrior 2024. 8. 25. 11:25

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต > ์—ฐ์Šต๋ฌธ์ œ > ๋ฆฌ์ฝ”์ณ‡ ๋กœ๋ด‡ (JS) ๋ฌธ์ œํ’€์ด

 

๐Ÿ”ฅ๋ฌธ์ œ

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ”ฅํ’€์ด

์ฒ˜์Œ์— DFS๋กœ ๋ฌธ์ œํ’€์ด ์ ‘๊ทผ์„ ํ–ˆ๋Š”๋ฐ ์—ฌ๋Ÿฌ์ผ€์ด์Šค์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ๋ฌธ์ œํ’€์ด์— ์‹คํŒจํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ดค๋Š”๋ฐ BFS๋กœ ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋‚ด ์ƒ๊ฐ์—๋„ ์ด ์ ‘๊ทผ๋ฒ•์ด ์‹œ๊ฐ„์ด ์›”๋“ฑํžˆ ์ ๊ฒŒ ๋“ค๊บผ๋ž€ ์ƒ๊ฐ์ด ๋“ค์–ด BFS๋กœ ๋‹ค์‹œ ๋ฌธ์ œํ’€์ด๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. 

 

์šฐ๋ฆฌ๋Š” ๋ชฉํ‘œ์œ„์น˜์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ๋ฏธ๋„๋Ÿฌ์ง ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ๋ชจ๋“  ๋ฐฉ์‹์„ ๋‹ค ํƒ์ƒ‰ํ•  ํ•„์š”์—†์ด n๋ฒˆ ์›€์ง์˜€์„ ๋•Œ ์ด๋™ํ•œ ์œ„์น˜์™€ ๋ช‡๋ฒˆ ์ด๋™ํ–ˆ๋Š”์ง€ ๊ฐ’๋งŒ ๊ธฐ์–ตํ•˜๊ณ  ์ด๋™ํ–ˆ๋˜ ํฌ์ธํŠธ๋ฅผ ์ฒดํฌ๋งŒ ํ•˜๋ฉด๋œ๋‹ค. (์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ํ•œ๋ฉด ์ง€๋‚˜๊ฐ„ ํฌ์ธํŠธ๋Š” visit_map์— ํ‘œ๊ธฐํ•˜์˜€๋‹ค.) 

 

function solution(board) {
    
    let min = undefined
    let [start_x,start_y]=[undefined,undefined]    
    for(let i=0; i<=board.length-1; ++i){
        for(let j=0; j<=board[0].length-1; ++j){
            if(board[i][j]==='R'){
                start_x =i 
                start_y =j
            }
        }
    }
    
    let visit_map = Array.from({length:board.length},(_)=>{
        return Array(board[0].length).fill(false)
    })
    
    // ๋™์„œ๋‚จ๋ถ
    let dx =[0,0,1,-1] , dy =[1,-1,0,0]
    let queue = [[start_x,start_y,0]]
    visit_map[start_x][start_y]=true
        
    while(queue.length){
        let [x,y,count] = queue.shift()
        if(board[x][y]==='G'){
            min =count
            break;
        }
        dx.forEach((_,i)=>{
            // ๋™์„œ๋‚จ๋ถ ์ˆœ
            let nx = x
            let ny = y 
            while(1){
                 nx += dx[i]
                 ny += dy[i]
                 if(!board[nx]||!board[nx][ny]||board[nx][ny]==='D'){
                     let [prev_x,prev_y] = [nx-dx[i],ny-dy[i]]
                     if(visit_map[prev_x][prev_y]===false){
                         queue.push([prev_x,prev_y,count+1])
                         visit_map[prev_x][prev_y]=true
                     }
                     
                     break;
                 }
            }
        })
    }
    
    return min === undefined ? -1 : min
    
}