|
| 1 | +/** |
| 2 | + * Source: https://www.lintcode.com/problem/178/ |
| 3 | + * Solution: ์ ํจํ ํธ๋ฆฌ์ธ์ง ์ํํ๋ฉด์ ํ์ธํ๋ฉด ๋๊ธฐ์ BFS๋ก ๊ตฌํ |
| 4 | + * ์๊ฐ ๋ณต์ก๋: O(V + E) - ๋
ธ๋์ ๊ฐ์ ์ ํ๋ฒ์ ๋ฐฉ๋ฌธ |
| 5 | + * ๊ณต๊ฐ ๋ณต์ก๋: O(V + E) - ์ธ์ ๋ฆฌ์คํธ ๋งํผ์ ๊ณต๊ฐ ํ์ |
| 6 | + */ |
| 7 | +function validTree(n: number, edges: number[][]): boolean { |
| 8 | + // ๊ฐ์ ๊ฐ์ ์ฒดํฌ: ํธ๋ฆฌ๋ ๋
ธ๋ ๊ฐ์ - 1๊ฐ์ ๊ฐ์ ์ ๊ฐ์ ธ์ผ ํจ |
| 9 | + if (edges.length !== n - 1) return false; |
| 10 | + |
| 11 | + // ์ธ์ ๋ฆฌ์คํธ |
| 12 | + const adjList: Map<number, number[]> = new Map(); |
| 13 | + for (let i = 0; i < n; i++) { |
| 14 | + adjList.set(i, []); |
| 15 | + } |
| 16 | + |
| 17 | + // ์๋ฐฉํฅ ๊ทธ๋ํ ๊ตฌ์ฑ |
| 18 | + for (const [u, v] of edges) { |
| 19 | + adjList.get(u)!.push(v); |
| 20 | + adjList.get(v)!.push(u); |
| 21 | + } |
| 22 | + |
| 23 | + const queue: [number, number][] = [[0, -1]]; // [๋
ธ๋, ๋ถ๋ชจ๋
ธ๋] |
| 24 | + const visited: Set<number> = new Set([0]); |
| 25 | + |
| 26 | + while (queue.length > 0) { |
| 27 | + const [node, parent] = queue.shift()!; |
| 28 | + |
| 29 | + // ๋ชจ๋ ์ด์ ๋
ธ๋ ํ์ธ |
| 30 | + for (const neighbor of adjList.get(node)!) { |
| 31 | + // ๋ถ๋ชจ ๋
ธ๋๋ continue |
| 32 | + if (neighbor === parent) continue; |
| 33 | + |
| 34 | + // ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ๋ง๋๋ฉด ์ฌ์ดํด ์กด์ฌ |
| 35 | + if (visited.has(neighbor)) return false; |
| 36 | + |
| 37 | + // ์ด์ ๋
ธ๋๋ฅผ ํ์ ์ถ๊ฐํ๊ณ ๋ฐฉ๋ฌธ ํ์ |
| 38 | + visited.add(neighbor); |
| 39 | + queue.push([neighbor, node]); |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + // ๋ชจ๋ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธ |
| 44 | + return visited.size === n; |
| 45 | +} |
0 commit comments