|
| 1 | +"""TC: O(n + e), SC: - |
| 2 | +
|
| 3 | +노드 개수 n개, 엣지 개수 e개 |
| 4 | +
|
| 5 | +아이디어: |
| 6 | +문제 설명부터가 deepcopy를 하라는 것이니 내장함수를 써서 deepcopy를 해주자. |
| 7 | +
|
| 8 | +SC: |
| 9 | +- 내장함수가 필요한 공간들을 따로 잘 관리해주지 않을까? 아마 변수를 읽고 그대로 리턴값으로 바꿔줄듯. |
| 10 | +- 그렇다면 추가적으로 관리하는 공간은 필요 없다. |
| 11 | +
|
| 12 | +TC: |
| 13 | +- deepcopy는 필요한 정보를 그대로 다 deepcopy 뜰 뿐이다. 아마 node 개수 + edge 개수에 비례해서 시간이 |
| 14 | + 걸릴것 같다. O(n + e). |
| 15 | +""" |
| 16 | + |
| 17 | +""" |
| 18 | +# Definition for a Node. |
| 19 | +class Node: |
| 20 | + def __init__(self, val = 0, neighbors = None): |
| 21 | + self.val = val |
| 22 | + self.neighbors = neighbors if neighbors is not None else [] |
| 23 | +""" |
| 24 | + |
| 25 | +import copy |
| 26 | +from typing import Optional |
| 27 | + |
| 28 | + |
| 29 | +class Solution: |
| 30 | + def cloneGraph(self, node: Optional["Node"]) -> Optional["Node"]: |
| 31 | + return copy.deepcopy(node) |
| 32 | + |
| 33 | + |
| 34 | +"""TC: O(e), SC: O(e) |
| 35 | +
|
| 36 | +노드 개수 n개, 엣지 개수 e개 |
| 37 | +
|
| 38 | +아이디어: |
| 39 | +dfs 돌면서 노드들을 메모해두자. neighbors에 특정 노드를 추가해야 할때 메모에 있으면 바로 가져다 |
| 40 | +쓰고, 없으면 새로 만들어서 메모에 노드를 추가한다. |
| 41 | +
|
| 42 | +SC: |
| 43 | +- 노드 총 n개가 memo에 올라간다. O(n). |
| 44 | +- 각 노드마다 neighbor가 있다. 각 edge마다 neighbor 리스트들의 총 아이템 개수에 2개씩 기여한다. O(e). |
| 45 | +- 더하면 O(n + e). 즉, 둘 중 더 큰 값이 공간복잡도를 지배한다. |
| 46 | + ...고 생각하는 것이 일차적인 분석인데, 여기서 더 나아갈 수 있다. |
| 47 | +- 주어진 조건에 따르면 우리에게 주어진 그래프는 connected graph다. 즉, 엣지 개수가 n-1개 이상이다. |
| 48 | +- 즉, O(n) < O(e)가 무조건 성립하므로, O(e) < O(n + e) < O(e + e) = O(e). 즉, O(e). |
| 49 | +
|
| 50 | +TC: |
| 51 | +- SC와 비슷한 방식으로 분석 가능. O(e). |
| 52 | +""" |
| 53 | + |
| 54 | +""" |
| 55 | +# Definition for a Node. |
| 56 | +class Node: |
| 57 | + def __init__(self, val = 0, neighbors = None): |
| 58 | + self.val = val |
| 59 | + self.neighbors = neighbors if neighbors is not None else [] |
| 60 | +""" |
| 61 | + |
| 62 | +from typing import Optional |
| 63 | + |
| 64 | + |
| 65 | +class Solution: |
| 66 | + def cloneGraph(self, node: Optional["Node"]) -> Optional["Node"]: |
| 67 | + if node is None: |
| 68 | + return node |
| 69 | + |
| 70 | + memo = {} |
| 71 | + |
| 72 | + def dfs(node): |
| 73 | + if node not in memo: |
| 74 | + new_node = Node(node.val, []) |
| 75 | + memo[node] = new_node |
| 76 | + new_node.neighbors = [dfs(i) for i in node.neighbors] |
| 77 | + return memo[node] |
| 78 | + |
| 79 | + return dfs(node) |
0 commit comments