Skip to content

Commit aa1d93e

Browse files
committed
solve(w08): 133. Clone Graph
1 parent cfdf2e5 commit aa1d93e

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

clone-graph/seungriyou.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# https://leetcode.com/problems/clone-graph/
2+
3+
# Definition for a Node.
4+
class Node:
5+
def __init__(self, val = 0, neighbors = None):
6+
self.val = val
7+
self.neighbors = neighbors if neighbors is not None else []
8+
9+
from typing import Optional
10+
11+
class Solution:
12+
def cloneGraph_dfs(self, node: Optional['Node']) -> Optional['Node']:
13+
"""
14+
[Complexity]
15+
- TC: O(n + m) (n = node 개수, m = edge 개수)
16+
- SC: O(n) (call stack & cache)
17+
18+
[Approach]
19+
{val: node} 형태의 dict를 캐시처럼 활용하여, DFS로 접근한다.
20+
각 node를 복제해야 하므로, 원본 node의 복제본을 O(1)에 lookup 하려면 dict에 key를 Node.val 값으로 설정해야 한다.
21+
"""
22+
copies = dict() # {val: node}
23+
24+
if not node:
25+
return None
26+
27+
def copy_node(curr):
28+
# base condition: 이미 copies에 존재하는 node라면 반환
29+
if curr.val in copies:
30+
return copies[curr.val]
31+
32+
# 현재 노드 복사
33+
copied_node = Node(val=curr.val)
34+
35+
# copies에 추가
36+
copies[curr.val] = copied_node
37+
38+
# neighbors를 순회하며, neighbors에 copy를 만들어 추가
39+
for ngbr in curr.neighbors:
40+
copied_node.neighbors.append(copy_node(ngbr))
41+
42+
# 복사한 노드 반환
43+
return copied_node
44+
45+
return copy_node(node)
46+
47+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
48+
"""
49+
[Complexity]
50+
- TC: O(n + m)
51+
- SC: O(n) (queue & cache)
52+
53+
[Approach]
54+
{val: node} 형태의 dict를 캐시처럼 활용하여, BFS로 접근한다.
55+
"""
56+
from collections import deque
57+
58+
copies = dict() # {val: node}
59+
60+
if not node:
61+
return None
62+
63+
q = deque([node])
64+
copied_root_node = Node(val=node.val)
65+
copies[node.val] = copied_root_node
66+
67+
while q:
68+
curr = q.popleft()
69+
70+
for ngbr in curr.neighbors:
71+
# ngbr.val이 캐시에 존재하지 않으면, copy 후 캐시에 저장
72+
if ngbr.val not in copies:
73+
# ngbr의 복사본 생성 및 캐시에 저장
74+
copies[ngbr.val] = Node(val=ngbr.val)
75+
76+
# ngbr은 아직 방문되지 않았으므로, q에 추가
77+
q.append(ngbr)
78+
79+
# curr 복사본의 neighbors에 ngbr 복사본 추가
80+
copies[curr.val].neighbors.append(copies[ngbr.val])
81+
82+
return copied_root_node

0 commit comments

Comments
 (0)