Skip to content

Commit e1b17a4

Browse files
Create taurus09318976.py
1 parent 94dfa2e commit e1b17a4

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

โ€Žclone-graph/taurus09318976.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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

Comments
ย (0)