์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ์ด๋ถํ์
- ์ฝํ
- ๋์ ๊ณํ๋ฒ
- React
- icecandidate
- custom hook
- ๋ถ์คํธ์ปจํผ๋ฐ์ค
- JavaScript
- ์๋ฐ์คํฌ๋ฆฝํธ
- ์ฝ๋ ํฌ๋ฉง
- ๋ธ๋ฃจํธํฌ์ค
- svgํ์ผ ๋ค๋ฃจ๊ธฐ
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- js
- TypeScript
- ์นด์นด์ค์ฑ์ฉ
- ๋ฐฑ์ค
- Node.js
- ์ฝ๋ฉํ ์คํธ
- ๊ณผ์ ํ ์คํธ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๊ณ ๋ฆฌ์ฆ
- router v6
- ๋๋๊ทธ ์ด๋ฒคํธ
- ์นด์นด์ค
- ์ด๋ฏธ์ง ์์
- DP
- Redux toolkit
- ๋ฆฌ๋์ค ํดํท
- ๋ถ์คํธ์บ ํ์น๋ชจ๋ฐ์ผ
- Today
- Total
๐ฅ dev-ruby
[ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ | ์๋ฐ์คํฌ๋ฆฝํธ | Lv.3 | 2022 KAKAO BLIND RECRUITMENT | DFS ๋ณธ๋ฌธ
[ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ | ์๋ฐ์คํฌ๋ฆฝํธ | Lv.3 | 2022 KAKAO BLIND RECRUITMENT | DFS
ruby_s 2022. 5. 6. 12:58๋ฌธ์
https://programmers.co.kr/learn/courses/30/lessons/92343
ํ์ด
function solution(info, edges) {
const tree = Array.from({ length: info.length }, () => []);
for (const [parent, child] of edges) tree[parent].push(child);
let answer = 0;
function dfs(node, sheep, wolf, possible) {
answer = Math.max(answer, sheep);
if (sheep <= wolf) return;
const possibleNode = [...possible, ...tree[node]];
possibleNode.splice(possibleNode.indexOf(node), 1);
for (const next of possibleNode) {
if (info[next]) dfs(next, sheep, wolf + 1, possibleNode); // ๋๋์ผ ๊ฒฝ์ฐ
else dfs(next, sheep + 1, wolf, possibleNode); // ์์ผ ๊ฒฝ์ฐ
}
}
dfs(0, 1, 0, [0]);
return answer;
}
์ด ๋ฌธ์ ๋๋ฌด ์ด๋ ค์ ๋ค.. ๊ทธ๋ฅ dfs๋ก ํ๋ฉด ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ ์ด๋ป๊ฒ ๋ ๋ฐฉ๋ฌธํ์ง ..? ์ถ์๋ค..
ํ๋์ฉ ํ์ดํด๋ณด๋ฉด, ๋จผ์ parent์ ์ธ๋ฑ์ค์ ๊ฐ๊ฐ [์ผ์ชฝ, ์ค๋ฅธ์ชฝ] ์์์ ๋ฃ์ด์ค๋ค. -> tree
์๋ ์์ ์ฌ์ง์ผ๋ก ์ค๋ช
ํ๊ฒ ๋ค.
์์์ ๋ณด๋ฉด 0 -> 1 -> 8 -> 7 -> 9 -> 4 -> 6 -> 5 ์ด ์์๋๋ก ๊ฐ์ผ ์์ ์ต๋๊ฐ์ด ๋์จ๋ค.
function dfs(node, sheep, wolf, possible) {
answer = Math.max(answer, sheep);
if (sheep <= wolf) return;
const possibleNode = [...possible, ...tree[node]];
possibleNode.splice(possibleNode.indexOf(node), 1);
for (const next of possibleNode) {
if (info[next]) dfs(next, sheep, wolf + 1, possibleNode);
else dfs(next, sheep + 1, wolf, possibleNode);
}
}
dfs๋ฅผ ๋ค์ด์ค๋ฉด sheep๊ฐ์๋ฅผ ๊ณ์ํด์ ๋ฐ์ํด์ค๋ค. ๋ง์ฝ sheep๋ณด๋ค wolf์ ๊ฐ์๊ฐ ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๋ฆฌํดํ๋ค.
์ด์ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์จ possible๊ณผ ํ์ฌ node์ ์์๋ ธ๋๋ค์ ํฉ์ณ์ค ๊ฒ์ด๋ค. possible์ ๋ง ๊ทธ๋๋ก ์์ง๊น์ง ๋ฐฉ๋ฌธํ ์ ์๋ ๋ ธ๋๋ค์ ๋ปํ๋ค. ๋ง์ฝ 2๋ ธ๋๋ฅผ ๋ค์ด๊ฐ๋ค ์์ด๋ wolf์ ๊ฐ์๊ฐ ๋ง์์ ์ข ๋ฃ๋๋ค๋ฉด 2๋ ์์ง ๋ฐฉ๋ฌธ์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ ธ๋๊ฐ ๋๋ค. -> possibleNode๋ฅผ ๋ฐ๋ณต๋ฌธ ๋๋ค๊ณ ํด์ ๊ผญ ๋ ธ๋๊ฐ ์ฌ๋ผ์ง๋๊ฒ ์๋. (๋์ ํฐ ์ฐฉ๊ฐ์ด์์. dfs๋ฅผ ๋ค์ด๊ฐ๋ค์ค๋ฉด ๊ฐ ๋ ธ๋๊ฐ ๊ผญ ์ฌ๋ผ์ง๋ค๊ณ ์ธ์งํด๋ฒ๋ ธ๋ค. if (sheep <= wolf) return; ์ด ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ๋ฉด ์์ฌ๋ผ์ง.)
์์ ๊ฐ๋ฅ์ฑ ์๋ ๋ ธ๋๋ค๊ณผ ํ์ฌ node์ ์์๋ ธ๋๋ฅผ ํฉ์น ๋ค์, ํ์ฌ node๋ ๋ฐฉ๋ฌธ์ ํ์ผ๋ฏ๋ก possibleNode์์ ์ ๊ฑฐํ๋ค.(splice) ๊ทธ๋ฆฌ๊ณค ์์ผ ๊ฒฝ์ฐ์ ๋๋์ผ ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ์นด์ดํธ๋ฅผ ์กฐ์ ํด์ฃผ๋ฉด ๋๋ค.
๋ฐฉ๋ฌธํ ํ์ฌ node์ possibleNode๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ณด๋๊ฒ ์ฌ์ค ์ดํด๊ฐ ๋น ๋ฅด๋ค.
// console.log(node, possibleNode)
0, [ 1, 8 ]
1, [ 8, 2, 4 ]
8, [ 2, 4, 7, 9 ]
2
4
7, [ 2, 4, 9 ]
2, [ 4, 9 ]
4
9, [ 4, 10, 11 ]
4, [ 10, 11, 3, 6 ]
10
11
3
6
0: 1, 8์ ์์๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ๋ ธ๋์ด๋ค.
1: ๋ณธ์ธ 1์ ์ ๊ฑฐํ๊ณ ์ ๋ฌ๋ฐ์ 8๊ณผ ๋ณธ์ธ์ ์์๋ ธ๋ 2, 4๊ฐ ๊ฐ๋ฅ์ฑ ์๋ ๋ ธ๋์ด๋ค.
8: ๋ณธ์ธ 8์ ์ ๊ฑฐํ๊ณ ์ ๋ฌ๋ฐ์ 2, 4์ ๋ณธ์ธ์ ์์๋ ธ๋ 7, 9๊ฐ ๊ฐ๋ฅ์ฑ ์๋ ๋ ธ๋์ด๋ค.
2: wolf๊ฐ ๋ ์ปค์ง๊ฑฐ๋ ๊ฐ์ผ๋ฏ๋ก ๋ฐ๋ก ๋ฆฌํด๋๋ค.
4: ๋ง์ฐฌ๊ฐ์ง.
7: ๋ณธ์ธ 7์ ์ ๊ฑฐํ๊ณ , 8๋ฒ์งธ ๋ ธ๋์์ ๊ทธ๋๋ก ์ ๋ฌ๋ฐ์ 2, 4, 9๊ฐ ๊ฐ๋ฅ์ฑ ์๋ ๋ ธ๋์ด๋ค.
2: ์์ 2์ ๋ค๋ฅด๊ฒ sheep์ ๊ฐ์๊ฐ ๋์ด์ ์์ผ๋ฏ๋ก 2๋ ๋ฐฉ๋ฌธํ ์ ์๋ค. ๋ณธ์ธ2๋ ์ ๊ฑฐํ๊ณ , 7์์ ์ ๋ฌ๋ฐ์ 4, 9๊ฐ ๊ฐ๋ฅ์ฑ ์๋ ๋ ธ๋์ด๋ค.
4: return
9: ๋ณธ์ธ 9๋ ์ ๊ฑฐํ๊ณ , 2์์ ์ ๋ฌ๋ฐ์ 4์ ๋ณธ์ธ์ ์์๋ ธ๋ 10, 11์ด ๊ฐ๋ฅ์ฑ ์๋ ๋ ธ๋์ด๋ค.
4: ์ฌ๊ธฐ์๋ถํฐ ์๋ต ...
๋ค์๋ถํฐ๋ ์ฝ๊ฒ ํ์์ผ๋ฉด ํ๋ค.. ๋ ์ฌ์ค ์์ง๋ ์ฌ๊ท๊ฐ ์ต์์น ์๋ค ..ใ ; ํ์ ์นํด์ง๊ณ ์ถ์ง ์์ ์น๊ตฌ๋ค.