๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[Javascript/PGS] Lv.3 : ๊ฒฝ์ฃผ๋กœ ๊ฑด์„ค (BFS)

by xxilliant 2025. 5. 7.
728x90
๋ฐ˜์‘ํ˜•

 

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

 

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

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ 3.

BFS + ์‚ผ์ฐจ์› ๋ฐฐ์—ด...

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ํ•˜ ใ… ใ…  ์ด์ฐจ์›๋ฐฐ์—ด๋กœ ํ’€๋‹ค๊ฐ€ ์‚ฝ์งˆํ•˜๋А๋ผ 1์‹œ๊ฐ„ ๊ฑธ๋ฆผ

์นด์นด์˜ค ๊ธฐ์ถœ์ด๋ผ ๊ทธ๋Ÿฐ์ง€, ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์‹ ๊ฒฝ์จ์•ผ ํ•  ๋‚ด์šฉ์ด ์ •๋ง์ •๋ง ๋งŽ์•˜๋‹ค.

์‚ผ์ฐจ์›๋ฐฐ์—ด bfs์—์„œ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ์ตœ์†Ÿ๊ฐ’์„ ์ €์žฅํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ,

์ถœ๋ฐœ์ ์—์„œ๋Š” ๋ฐฉํ–ฅ์ด ์ƒ๊ด€์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ๋„ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ–ˆ์Œ!!

๊ทธ๋ฆฌ๊ณ  ์ฝ”๋„ˆ์—์„œ๋Š” ์ฝ”๋„ˆ ๋„๋กœ + ์ง์ง„๋„๋กœ ๋ชจ๋‘ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 600์„ ๋”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

๊ฐœ์ธ์ ์œผ๋กœ ํ•จ์ •์ด ๋งŽ์•˜๋˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐ

์‹ค๋ ฅ ์ฆ์ง„ํ•˜๊ธฐ ์ฐธ ์–ด๋ ต๋‹ค

๋‹ค์‹œ ๋А๋‚€ ์ ์ด์ง€๋งŒ, JS๋Š” ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”๊ฐ€ ์ฐธ ๋ถˆํŽธํ•˜๋‹ค..^-^

 

๋‚˜์˜ ํ’€์ด

let dx = [0,1,0,-1]; // ์‹œ๊ณ„๋ฐฉํ–ฅ : ์œ„, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜, ์™ผ์ชฝ
let dy = [1,0,-1,0];
let visited;
let Board;

function canVisit(x, y, size){
    if(x<0 || x>=size || y<0 || y>=size) return false;
    if(Board[x][y]==1) return false;
    return true;
}

function solution(board) {
    Board = board;
    let answer;
    let size = board.length;
    // ๋ฐฉํ–ฅ์— ๋”ฐ๋ฅธ ์ €์žฅ์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๋ฏ€๋กœ, ์‚ผ์ฐจ์› ๋ฐฐ์—ด ํ™œ์šฉ
    let visit = Array.from({length:size},()=>
                           Array.from({length:size},()=>
                                      Array(4).fill(Infinity)));
    visited = visit;
    let q = [];
    q.push([0,0,-1,0]); // x, y, ๋ฐฉํ–ฅ, ๊ธˆ์•ก
    while(q.length){
        let [x, y, d, cost] = q.shift();
        for(let i=0; i<4; ++i){
            let nx = x + dx[i];
            let ny = y + dy[i];
            if(canVisit(nx,ny,size)){
                // ์ง์„   100์›, ์ฝ”๋„ˆ 500์›+100์› ์ถ”๊ฐ€
                let newCost = d==i? cost+100 : cost+600;
                if(d<0) newCost = cost+100; // ์ถœ๋ฐœํ• ๋•Œ(๋ฐฉํ–ฅ : -1) ํ•ญ์ƒ ์ง์ง„์ž„
                if(visited[nx][ny][i]>newCost){
                    q.push([nx,ny,i,newCost]);
                    visited[nx][ny][i] = newCost;
                }
            }
        }
    }
    // console.log(visited);
    answer = Math.min(...visited[size-1][size-1]);
    return answer;
}

728x90
๋ฐ˜์‘ํ˜•