๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[Javascript/PGS] Lv.3 : ์•„์ดํ…œ ์ค๊ธฐ(BFS)

728x90

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

 

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

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

programmers.co.kr

 


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ 3 ๋ฌธ์ œ์ด๋‹ค

์ฒ˜์Œ์— ์ผ๋ถ€ ํ…Œ์ผ€๊ฐ€ ๊ณ„์† ํ‹€๋ ค์„œ ์‚ฝ์งˆํ–ˆ์—ˆ๋Š”๋ฐ

์•Œ๊ณ ๋ณด๋‹ˆ map ๋ณ€์ˆ˜๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒŒ ๋ฌธ์ œ์˜€๋‹ค.... (์ด๊ฑฐ ํ•˜๋‚˜๋•Œ๋ฌธ์— ๋ช‡ ์‹œ๊ฐ„์„ ์•“์Œ)

 

js์—์„œ๋Š” ๋ฐฐ์—ด ๊ฐ’์„ ์ง์ ‘ ๋ฐ”๊ฟ€๋•Œ ์ค‘๋ณต์ด ๋˜๋ฉด ๋ญ”๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋‚˜๋ณด๋‹ค

์ค‘๋ณต, ๋ฎ์–ด์“ฐ๊ธฐ ์ตœ๋Œ€ํ•œ ์—†๋„๋ก ์งœ๊ธฐ!

 

Main Idea => ๋งต์„ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ ค์„œ, ใ„ท์ž๋กœ ์šฐํšŒํ•ด์•ผํ•˜๋Š”๋ฐ ์งํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๋ถ€๋ถ„์ด ์—†๋„๋ก ํ•จ

๊ทธ๋ฆฌ๊ณ  ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ˆ, BFS๋กœ ํ‘ผ๋‹ค!

 

 

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

let dx = [0, 1, 0, -1];
let dy = [1, 0, -1, 0];
let map = new Array(101).fill(null).map(() => new Array(101).fill(0));  
let visited = new Array(101).fill(null).map(() => new Array(101).fill(0));

function canVisit(nx, ny) {
    if (nx < 0 || nx > 100 || ny < 0 || ny > 100) return false;
    if (map[nx][ny] !== 1) return false;
    if (visited[nx][ny] === 1) return false;
    return true;
}

function bfs(x, y, itemX, itemY) {
    let q = [[x, y, 0]];
    visited[x][y] = 1;

    while (q.length !== 0) {
        let [cx, cy, cnt] = q.shift();
        if (cx === itemX && cy === itemY) return cnt / 2;
        for (let i = 0; i < 4; ++i) {
            let nx = cx + dx[i];
            let ny = cy + dy[i];

            if (canVisit(nx, ny)) {
                q.push([nx, ny, cnt + 1]);
                visited[nx][ny] = 1;
            }
        }
    }
    return -1;
}

function solution(rectangle, characterX, characterY, itemX, itemY) {
    let answer = 0;
    let doubleRec = rectangle.map(rec => rec.map (point => point*2));
    
    doubleRec.forEach(([x1,y1,x2,y2])=>{
        for(let i=x1;i<=x2;i++){
            for(let j=y1;j<=y2;j++){
                if(i === x1 || i === x2 || j === y1 || j === y2){
                    if(map[i][j]===0){map[i][j]=1;}
                }
                else{map[i][j]=2;}
            }
        }
        
    });
    answer = bfs(characterX*2, characterY*2, itemX*2, itemY*2);
    
    return answer;
}

728x90