Skip to content

Commit 532e7b5

Browse files
committed
DaleStudy#259 Clone Graph
1 parent d57ce2a commit 532e7b5

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

clone-graph/forest000014.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
# Time Complexity: O(n * e), where e is the maximum number of edges of a node
3+
- 전체 node를 순회하면서, 그 이웃에 해당하는 복제본을 생성해서 복제본끼리 연결해준다.
4+
- 단, 중복 방문을 막기 위해, 복제본이 이미 이웃 복제본을 가지고 있는지 확인한다. 이 과정에서 O(e)만큼의 List 순회를 한다.
5+
6+
# Space Complexity: O(n)
7+
- 전체 Node 만큼의 메모리가 필요하다.
8+
(Space Complexity를 계산하기 애매한 측면이 있네요. 저는 지금까지 출력은 space complexity에 포함하지 않고 계산했었는데, 그 이유는 "어떤 알고리즘을 구현하든 출력은 동일하기 때문"인데요. 이 문제의 경우에 출력은 Node 하나이지만, 실제로는 Node 전체만큼의 메모리를 반드시 생성해야 한다는 특수성이 있습니다. 그래서 "어떻게 구현하든 동일하게 사용해야만 하는 메모리는 Space Complexity에서 배제한다" 라는 논리로만 보자면 O(1)일 것 같고, "출력을 제외한 메모리 사용은 Space Complexity에 포함한다" 라는 논리대로라면 O(n)인 것 같습니다.)
9+
10+
11+
전체 노드를 DFS로 순회하면서 이웃 노드의 복제본을 생성하여 현재 노드의 복제본과 연결을 맺어줍니다.
12+
다만, 중복 방문을 막기 위해, 복제본이 이미 이웃 복제본을 가지고 있는지 확인한다.
13+
또한 순환 참조(cycle 구조)를 막기 위해서, 복제본 노드를 생성시 단순히 new 키워드를 사용하지 않고, 별도의 map을 통해 싱글톤으로 생성한다. (각 노드의 val은 distinct하다는 점을 이용)
14+
15+
16+
// Definition for a Node.
17+
class Node {
18+
public int val;
19+
public List<Node> neighbors;
20+
public Node() {
21+
val = 0;
22+
neighbors = new ArrayList<Node>();
23+
}
24+
public Node(int _val) {
25+
val = _val;
26+
neighbors = new ArrayList<Node>();
27+
}
28+
public Node(int _val, ArrayList<Node> _neighbors) {
29+
val = _val;
30+
neighbors = _neighbors;
31+
}
32+
}
33+
*/
34+
35+
class Solution {
36+
37+
Map<Integer, Node> map = new HashMap<>();
38+
39+
public Node cloneGraph(Node node) {
40+
if (node == null) {
41+
return null;
42+
}
43+
44+
Node newNode = createNode(node.val);
45+
dfs(node, newNode);
46+
47+
return newNode;
48+
}
49+
50+
public Node createNode(int val) {
51+
if (!map.containsKey(val)) {
52+
map.put(val, new Node(val));
53+
}
54+
return map.get(val);
55+
}
56+
57+
public void dfs(Node oldNode, Node newNode) {
58+
List<Node> dfsList = new ArrayList<>();
59+
60+
for (Node oldNeighbor : oldNode.neighbors) {
61+
boolean hasIt = false;
62+
for (Node newNeighbor : newNode.neighbors) {
63+
if (newNeighbor.val == oldNeighbor.val) {
64+
hasIt = true;
65+
break;
66+
}
67+
}
68+
69+
if (!hasIt) {
70+
Node newNeighbor = createNode(oldNeighbor.val);
71+
newNode.neighbors.add(newNeighbor);
72+
newNeighbor.neighbors.add(newNode);
73+
dfs(oldNeighbor, newNeighbor);
74+
}
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)