문제링크 - https://leetcode.com/problems/clone-graph/description/?envType=study-plan-v2&envId=top-interview-150
해당 문제는 그래프 탐색만으로 해결할 수 있다. 탐색 중인 노드의 값을 새로운 노드에 해당 값으로 생성하여 연결하면 된다
visited HashMap<Integer, Node>로 방문한 노드를 나타낸다. 각 노드 값은 unique이기 때문에 key로 노드 값을 사용한다.stack 앞으로 방문할 노드를 저장해둘 Stack이다.clone 복사할 노드의 시작 위치 노드이다current stack에서 꺼내온 탐색할 노드이다.newNeighbor 현재 노드의 이웃 노드 중 스택에 없는 노드이다.Node clone = new Node(node.val);
visited.put(clone.val, clone);
stack.push(node);
while (!stack.isEmpty()) {
Node current = stack.pop();
for (Node neighbor : current.neighbors) {
if (!visited.containsKey(neighbor.val)) {
Node newNeighbor = new Node(neighbor.val);
visited.put(newNeighbor.val, newNeighbor);
stack.push(neighbor);
}
visited.get(current.val).neighbors.add(visited.get(neighbor.val));
}
}
class Solution {
public Node cloneGraph(Node node) {
if (node == null) {
return null;
}
HashMap<Integer, Node> visited = new HashMap<>();
Stack<Node> stack = new Stack<>();
Node clone = new Node(node.val);
visited.put(clone.val, clone);
stack.push(node);
while (!stack.isEmpty()) {
Node current = stack.pop();
for (Node neighbor : current.neighbors) {
if (!visited.containsKey(neighbor.val)) {
Node newNeighbor = new Node(neighbor.val);
visited.put(newNeighbor.val, newNeighbor);
stack.push(neighbor);
}
visited.get(current.val).neighbors.add(visited.get(neighbor.val));
}
}
return clone;
}
}
시간 복잡도
공간 복잡도
visited, stack, clone은 각각 노드만큼 사용하기 때문에 공간 복잡도는 O(노드의 수)이다.
class Solution {
private HashMap<Integer, Node> visited = new HashMap<>();
public Node cloneGraph(Node node) {
if (node == null) {
return null;
}
if (visited.containsKey(node.val)) {
return visited.get(node.val);
}
Node clone = new Node(node.val, new ArrayList<>());
visited.put(clone.val, clone);
for (Node neighbor : node.neighbors) {
clone.neighbors.add(cloneGraph(neighbor));
}
return clone;
}
}