Given a reference of a node in a connected undirected graph.
Return a deep copy (clone) of the graph.
Each node in the graph contains a value (int) and a list (List[Node]) of its neighbors.
풀이
주어지는 그래프를 깊은 복사* (참조가 아니라 메모리에 새로 저장)하여 복사한 그래프를 리턴하면 되는 문제이다.
사실 문제를보고 간단하게 deepcopy 함수를 사용하면 바로 풀릴거라 생각했지만 ㅋㅋ 그래프를 탐색해서 풀라는 문제이니 deuqe을 사용해서 딕셔너리로 방문한 리스트 기록하며 bfs탐색을 했다.
1. 주어지는 첫 노드를 deque에 넣는다..
2.deque가 완전히 비워질 때 까지 while을 순회하며 bfs 탐색을한다.
3. cur을 통해 큐에 들어온 원소들을 뽑아서 인접한 노드를 탐색한다.
4.만약 딕셔너리에 현재 돌고있는 이웃 노드를 방문을 안했다면 딕셔너리 노드에 현재 인덱스 dict[cur]에 노드 생성,
-> neighbors에 인접한 노드의 딕셔너리 인덱스를 넣어준다, (딕셔너리를 통해 각 노드인덱스를 모두 방문할 때 까지 갱신)
5.최초 방문이라면 큐에 다시 넣어준다.
5. 방문을 했다면 딕셔너리의 해당 인접노드의 딕셔너리 인덱스의 값을 현재 노드의 딕셔너리의 이웃으로 재갱신 해준다.
from collections import deque
class Solution(object):
def cloneGraph(self, node):
if node == None:
return
q = deque()
visit = dict()
visit[node.val]= Node(val=node.val)
q.append(node)
while q:
cur=q.popleft()
for i in cur.neighbors:
if i.val not in visit:
visit[i.val]=Node(i.val)
q.append(i)
visit[cur.val].neighbors.append(visit[i.val])
return visit[node.val]
처음에 문제를 제대로 이해 못하고, 기존 node클래스에 neighbors속성이 리스트로 구성되어 있는줄 알고 리스트로 계속 넣으려고 하다가 실패했다.
for i in cur.neighbors:
if i.val not in visit:
visit[i.val]=Node(i.neighbors)
visit[node.val].neighbors.append(visit[i.val].neighbors)
return visit[node.val]
백준으로 문제를 풀 때는 각 리스트를 변수에 저장해서 사용하기에 쉽게 느껴졌는데, 클래스를 통해 문제를 풀려고하니 좀 헤멨던 것 같다.
다른사람의 코드
class Solution:
def cloneGraph(self, node: 'Node') -> 'Node':
if not node: return
d = {node: Node(node.val)}
stack = [node]
while stack:
curNode = stack.pop()
for nei in curNode.neighbors:
if nei not in d:
d[nei] = Node(nei.val)
stack.append(nei)
d[nei].neighbors.append(d[curNode])
return d[node]
dfs로 깊이탐색을 진행하며, 방법은 동일한다, 순서가 상관없기에 bfs든 dfs던 그래프를 모두 탐색하여 값을 찾아오면 된다.
'알고리즘 > LeetCode' 카테고리의 다른 글
LeetCode 909. Snakes and Ladders (python) (0) | 2023.09.15 |
---|---|
LeetCode 212. Word Search II (0) | 2023.09.12 |
LeetCode 373. Find K Pairs with Smallest Sums (python) (0) | 2023.09.12 |
LeetCode 215. Kth Largest Element in an Array (python) (0) | 2023.09.12 |
LeetCode 211. Design Add and Search Words Data Structure (python) (0) | 2023.09.12 |