|
| 1 | +""" |
| 2 | +๋ฌธ์ ์ ํต์ฌ ํฌ์ธํธ: |
| 3 | +๊ฐ ๋
ธ๋๋ ๊ฐ๊ณผ ์ด์ ๋
ธ๋๋ค์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง |
| 4 | +์๋ณธ ๊ทธ๋ํ์ ์์ ํ ๋
๋ฆฝ์ ์ธ ์๋ก์ด ๊ทธ๋ํ ์์ฑ |
| 5 | +๋ชจ๋ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌ |
| 6 | +
|
| 7 | +ํด๊ฒฐ ๋ฐฉ๋ฒ: |
| 8 | +DFS(๊น์ด ์ฐ์ ํ์) + ํด์๋งต์ ์ฌ์ฉํจ: |
| 9 | +ํด์๋งต์ผ๋ก ์๋ณธ ๋
ธ๋์ ๋ณต์ฌ๋ณธ ๋
ธ๋์ ๋งคํ ๊ด๊ณ ์ ์ฅ |
| 10 | +DFS๋ก ๊ทธ๋ํ๋ฅผ ์ํํ๋ฉด์ ๊ฐ ๋
ธ๋๋ฅผ ๋ณต์ฌ |
| 11 | +์ด๋ฏธ ๋ณต์ฌ๋ ๋
ธ๋๋ ํด์๋งต์์ ์ฐพ์์ ์ฌ์ฌ์ฉ |
| 12 | +
|
| 13 | +Example 1์ ๊ฒฝ์ฐ |
| 14 | +1 --- 2 |
| 15 | +| | |
| 16 | +| | |
| 17 | +4 --- 3 |
| 18 | +
|
| 19 | +์คํ ๊ณผ์ : |
| 20 | +๋
ธ๋ 1 ๋ณต์ฌ: clone_1 ์์ฑ, visited = clone_1 |
| 21 | +๋
ธ๋ 1์ ์ด์ 2 ๋ณต์ฌ: clone_2 ์์ฑ, visited = clone_2 |
| 22 | +๋
ธ๋ 2์ ์ด์ 1 ์ฒ๋ฆฌ: ์ด๋ฏธ visited์ ์์ผ๋ฏ๋ก clone_1 ๋ฐํ |
| 23 | +๋
ธ๋ 2์ ์ด์ 3 ๋ณต์ฌ: clone_3 ์์ฑ, visited = clone_3 |
| 24 | +๋
ธ๋ 3์ ์ด์๋ค ์ฒ๋ฆฌ: clone_2, clone_4 ์ฐ๊ฒฐ |
| 25 | +๋
ธ๋ 1์ ์ด์ 4 ๋ณต์ฌ: clone_4 ์์ฑ, visited = clone_4 |
| 26 | +๋ชจ๋ ์ฐ๊ฒฐ ๊ด๊ณ ์์ฑ |
| 27 | +Output: ์๋ณธ๊ณผ ๋์ผํ ๊ตฌ์กฐ์ ์์ ํ ์๋ก์ด ๊ทธ๋ํ |
| 28 | +
|
| 29 | +์๊ฐ ๋ณต์ก๋: O(V + E) |
| 30 | +V: ๋
ธ๋(์ ์ )์ ๊ฐ์, E: ๊ฐ์ ์ ๊ฐ์ |
| 31 | +๊ฐ ๋
ธ๋๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ณ , ๊ฐ ๊ฐ์ ์ ํ ๋ฒ์ฉ ์ฒ๋ฆฌ |
| 32 | +DFS์ ํ์ค ์๊ฐ ๋ณต์ก๋ |
| 33 | +
|
| 34 | +๊ณต๊ฐ ๋ณต์ก๋: O(V) |
| 35 | +visited ํด์๋งต์ด ๋ชจ๋ ๋
ธ๋๋ฅผ ์ ์ฅ: O(V) |
| 36 | +DFS ์ฌ๊ท ํธ์ถ ์คํ์ ์ต๋ ๊น์ด: O(V) |
| 37 | +๋ณต์ฌ๋ ๊ทธ๋ํ ์์ฒด๋ O(V + E)์ ๊ณต๊ฐ ํ์ |
| 38 | +""" |
| 39 | + |
| 40 | +from typing import Optional |
| 41 | +class Solution: |
| 42 | + def cloneGraph(self, node: Optional['Node']) -> Optional['Node']: |
| 43 | + # ๋น ๊ทธ๋ํ์ธ ๊ฒฝ์ฐ None ๋ฐํ |
| 44 | + if not node: |
| 45 | + return None |
| 46 | + |
| 47 | + # ์๋ณธ ๋
ธ๋๋ฅผ ํค๋ก, ๋ณต์ฌ๋ณธ ๋
ธ๋๋ฅผ ๊ฐ์ผ๋ก ํ๋ ํด์๋งต ์์ฑ |
| 48 | + # ์ค๋ณต ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํ๊ณ ์ํ ์ฐธ์กฐ ๋ฌธ์ ํด๊ฒฐ |
| 49 | + visited = {} |
| 50 | + |
| 51 | + # DFS ํจ์ ์ ์ |
| 52 | + def dfs(original_node): |
| 53 | + # ์ด๋ฏธ ๋ณต์ฌ๋ ๋
ธ๋๋ผ๋ฉด ๊ธฐ์กด ๋ณต์ฌ๋ณธ์ ๋ฐํ (์ค๋ณต ๋ณต์ฌ ๋ฐฉ์ง) |
| 54 | + if original_node in visited: |
| 55 | + return visited[original_node] |
| 56 | + |
| 57 | + # ์๋ณธ ๋
ธ๋์ ๊ฐ์ผ๋ก ์๋ก์ด ๋
ธ๋ ์์ฑ |
| 58 | + # ์ด์ ๋ฆฌ์คํธ๋ ๋น ๋ฆฌ์คํธ๋ก ์ด๊ธฐํ |
| 59 | + clone_node = Node(original_node.val, []) |
| 60 | + |
| 61 | + # ํด์๋งต์ ์๋ณธ-๋ณต์ฌ๋ณธ ๋งคํ ๊ด๊ณ ์ ์ฅ |
| 62 | + # ์ํ ์ฐธ์กฐ ๋ฐฉ์ง๋ฅผ ์ํด ์ด์์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋จผ์ ์ ์ฅ |
| 63 | + visited[original_node] = clone_node |
| 64 | + |
| 65 | + # ์๋ณธ ๋
ธ๋์ ๋ชจ๋ ์ด์๋ค์ ์ฌ๊ท์ ์ผ๋ก ๋ณต์ฌ |
| 66 | + # ๋ณต์ฌ๋ ์ด์ ๋
ธ๋๋ค์ ํ์ฌ ๋ณต์ฌ๋ณธ์ ์ด์ ๋ฆฌ์คํธ์ ์ถ๊ฐ |
| 67 | + for neighbor in original_node.neighbors: |
| 68 | + # ์ด์ ๋
ธ๋๋ฅผ ๋ณต์ฌํ๊ณ ํ์ฌ ๋
ธ๋์ ์ด์ ๋ฆฌ์คํธ์ ์ถ๊ฐ |
| 69 | + clone_node.neighbors.append(dfs(neighbor)) |
| 70 | + |
| 71 | + # ์์ฑ๋ ๋ณต์ฌ๋ณธ ๋
ธ๋ ๋ฐํ |
| 72 | + return clone_node |
| 73 | + |
| 74 | + # ์ฃผ์ด์ง ๋
ธ๋๋ถํฐ DFS ์์ |
| 75 | + return dfs(node) |
| 76 | + |
| 77 | + |
| 78 | + |
| 79 | + |
0 commit comments