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];
}

'๐ ์๊ณ ๋ฆฌ์ฆ > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript/PGS] Lv.2 : ๋ฐฉ๋ฌธ ๊ธธ์ด (Set) (0) | 2025.03.03 |
---|---|
[Javascript/PGS] Lv.3 : ์คํฐ์ปค ๋ชจ์ผ๊ธฐ(2) - ํ๋๋ง ํ๋ฆด ๋ ํด๊ฒฐ (0) | 2025.02.27 |
[Javascript/PGS] Lv.2 : ์คํฌํธ๋ฆฌ (0) | 2025.02.26 |
[Javascript/PGS] Lv.2 : ํผ๋ณด๋์น ์ (1) | 2025.02.19 |
[Javascript/PGS] Lv.3 : ๊ธฐ์ง๊ตญ ์ค์น (0) | 2025.02.18 |