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

[Javascript/PGS] Lv.3 : ๋“ฑ๋Œ€ - js ๋Ÿฐํƒ€์ž„์—๋Ÿฌ ํ•ด๊ฒฐ๋ฒ•

by xxilliant 2025. 2. 26.
728x90
๋ฐ˜์‘ํ˜•

 

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

 

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

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

programmers.co.kr

 


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ 3 ๋“ฑ๋Œ€ ๋ฌธ์ œ - ํŠธ๋ฆฌ dp, dfs ์œ ํ˜•

* ์ •๋‹ต ํ’€์ด๋Š” ์ตœํ•˜๋‹จ์—

 

1. ์žฌ๊ท€ ํ’€์ด - DFS

์ด ํ’€์ด๋Š” ํŠธ๋ฆฌ dp ๋ฌธ์ œ์˜ ์ •์„์ธ ๋А๋‚Œ์ธ๋ฐ, js๋กœ๋Š” ํ’€ ์ˆ˜ ์—†๋‹ค.

ํŒŒ์ด์ฌ์˜ ๊ฒฝ์šฐ์—๋Š” sys.setrecursionlimit๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์žฌ๊ท€์˜ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ

์ด๋ ‡๊ฒŒ ํ’€๋ฉด ๋˜์ง€๋งŒ...

์ž์Šค๋Š” ๊ทธ๋Ÿฐ๊ฑฐ ์—†๋‹ค๊ณ  ํ•จ

 

์ด ํ’€์ด๋กœ ์ œ์ถœ ์‹œ 93.8์ ์ด ๋‚˜์™”๋‹ค. (ํ…Œ์ŠคํŠธ 9๋งŒ ํ‹€๋ฆผ)

 

let dp = null;
let visited = null;
let graph = null;

function dfs(node){
    visited[node] = true;
    dp[node][1] += 1;
    for(let i=0; i<graph[node].length; ++i){
        let child = graph[node][i];
        if(visited[child]) continue;
        dfs(child); // ์ž์‹ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
        dp[node][0] += dp[child][1]; // ๋ถ€๋ชจ๊ฐ€ ์•ˆ ์ผœ์ง€๋ฉด ์ž์‹์ด ์ผœ์ ธ์•ผ ํ•จ
        dp[node][1] += Math.min(dp[child][0],dp[child][1]) // ์ผœ์ง€๋ฉด ์ž์‹์˜ ์ตœ์†Ÿ๊ฐ’์„ ๋”ํ•จ
    }
}

function solution(n, lh) {
    visited = new Array(n+1).fill(false);
    graph = new Array(n+1).fill(null).map(()=>[]);
    dp = new Array(n+1).fill(null).map(()=>[0,0]);
    lh.map((l)=>{
        graph[l[0]].push(l[1]);
        graph[l[1]].push(l[0]);
    });
    dfs(1);

    if(dp[1][0] > dp[1][1]) return dp[1][1];
    return dp[1][0];
}

 

๊ทธ๋ž˜์„œ..

๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•œ๋‹ค.

dfs๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฑด ์ฒ˜์Œ์ธ๋ฐ, stack์„ ์‚ฌ์šฉํ•œ while ๋ฃจํ”„๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•จ

 

JS์˜ ์žฌ๊ท€๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋กœ์ง์ด ์—†๋‹ค๊ณ  ํ•˜๋Š” ๋“ฏ..?

๊ทธ๋ž˜์„œ ์•„๋ž˜ ๊ธ€ ์ฒ˜๋Ÿผ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

https://chamdom.blog/dfs-using-js/

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] JavaScript๋กœ ๊ตฌํ˜„ํ•˜๋Š” DFS

dfs์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „์— ์šฐ์„  ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ ์— ์ž์„ธํžˆ ์ •๋ฆฌํ•ด๋‘์—ˆ๋‹ค. DFS๋ž€? DFS(Depth-First-Search) ๋Š” โ€ฆ

chamdom.blog

 

 

2. while๋ฌธ ํ’€์ด

๋ฐ˜๋ณต๋ฌธ์—์„œ๋Š” ์žฌ๊ท€๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด stack์—์„œ pop ํ•ด์คฌ๋‹ค๊ฐ€, ์ฒซ ๋ฐฉ๋ฌธ์œผ๋กœ ํƒ์ง€๋˜๋ฉด ๋‹ค์‹œ pushํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

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

// dp[1][0] : ๋“ฑ๋Œ€ 1์„ ์•ˆ ์ผฌ -> ์—ฐ๊ฒฐ๋œ ์ž์‹๋…ธ๋“œ๋Š” ์ผœ์ ธ์•ผํ•จ
// dp[1][1] : ๋“ฑ๋Œ€ 1์„ ์ผฌ -> ์—ฐ๊ฒฐ๋œ ์ž์‹๋…ธ๋“œ๋Š” ์ƒํƒœ ๋ฌด๊ด€
// ํŠธ๋ฆฌ ์ˆœํšŒ -> dfs
// dfs์ง€๋งŒ javascript๋Š” ์žฌ๊ท€๋กœ ํ’€๋ฉด ํ…Œ์ŠคํŠธ 9 ์‹œ๊ฐ„์ดˆ๊ณผ -> ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ
let dp = null;
let visited = null;
let graph = null;

function solution(n, lh) {
    visited = new Array(n+1).fill(false);
    graph = new Array(n+1).fill(null).map(()=>[]);
    dp = new Array(n+1).fill(null).map(()=>[0,0]);
    lh.map((l)=>{
        graph[l[0]].push(l[1]);
        graph[l[1]].push(l[0]);
    });
    
    let stack = [1];
    
    while (stack.length > 0) {
        let node = stack.pop();
        if (!visited[node]) { // ๋ฐฉ๋ฌธ x
            visited[node] = true;
            stack.push(node); // ๋‹ค์‹œ ๋„ฃ์–ด์„œ DP ์—…๋ฐ์ดํŠธ์šฉ
            for (let child of graph[node]) {
                if (!visited[child]) stack.push(child);
            }
        } else { // ๋‹ค์‹œ ๋ฐฉ๋ฌธ ์‹œ DP ์—…๋ฐ์ดํŠธ
            dp[node][1] += 1;
            for (let child of graph[node]) { // ๋…ธ๋“œ์˜ ์ž์‹๋“ค
                dp[node][0] += dp[child][1]; // ๋ถ€๋ชจ๊ฐ€ OFF๋ฉด ์ž์‹์ด ON์ด์–ด์•ผ ํ•จ
                dp[node][1] += Math.min(dp[child][0], dp[child][1]); // ON์ด๋ฉด ์ตœ์†Œ๊ฐ’ ์„ ํƒ
            }
        }
    }

    if(dp[1][0] > dp[1][1]) return dp[1][1];
    return dp[1][0];
}

728x90
๋ฐ˜์‘ํ˜•