|
| 1 | +package leetcode_study |
| 2 | + |
| 3 | +/* |
| 4 | +* Graph Node ๋ณต์ฌ ๋ฌธ์ |
| 5 | +* queue๋ฅผ ์ฌ์ฉํด ๋ฌธ์ ํด๊ฒฐ |
| 6 | +* ์๋ก ์์ฑํ Node์ ๋ํด ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๊ฒฝ์ฐ ๋ฌดํ Loop์ ๋น ์ง๊ฒ๋จ -> ๊ฐ ๋
ธ๋๊ฐ ์๋ฐฉํฅ์ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ. |
| 7 | +* ๋ฐ๋ผ์, Map ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด Map<๊ธฐ์กด Node, ๋ณต์ฌ Node>์ ๋ชจ์ต์ผ๋ก Key-Value ์์ผ๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํํ |
| 8 | +* |
| 9 | +* ์๊ฐ ๋ณต์ก๋: O(n) |
| 10 | +* -> graph์ Node๋ฅผ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ์ฌ ๋ณต์ฌํ๋ ๊ณผ์ : O(n) |
| 11 | +* ๊ณต๊ฐ ๋ณต์ก๋: |
| 12 | +* -> ๋ณต์ฌ๋ Node๋ฅผ ๋งคํํ๋ Map ์๋ฃ๊ตฌ์กฐ์ ํฌ๊ธฐ: O(n) |
| 13 | +* -> BFS๋ฅผ ์ฌ์ฉํ queue size: O(n) |
| 14 | +* -> ์๋ก ์์ฑ๋ Node์ neighbor list: O(n) |
| 15 | +* */ |
| 16 | +fun cloneGraph(node: Node?): Node? { |
| 17 | + if (node == null) return null |
| 18 | + if (node.neighbors.isEmpty()) return Node(1) |
| 19 | + |
| 20 | + // Map< ๊ธฐ์กด Node, ๋ณต์ฌ Node> |
| 21 | + val nodeMap = mutableMapOf<Node, Node>() |
| 22 | + |
| 23 | + val queue = ArrayDeque<Node>() |
| 24 | + queue.add(node) |
| 25 | + nodeMap[node] = Node(node.`val`) |
| 26 | + |
| 27 | + while (queue.isNotEmpty()) { |
| 28 | + val current = queue.removeFirst() |
| 29 | + val clonedNode = nodeMap[current]!! // ํ์ฌ ๋
ธ๋์ ๋ณต์ ๋ณธ |
| 30 | + |
| 31 | + for (neighbor in current.neighbors) { |
| 32 | + if (neighbor == null) continue |
| 33 | + |
| 34 | + // ํด๋น ์ด์์ด ์์ง ๋ณต์ฌ๋์ง ์์๋ค๋ฉด ๋ณต์ฌํ์ฌ ๋งต์ ์ ์ฅํ๊ณ ํ์ ์ถ๊ฐ |
| 35 | + if (!nodeMap.containsKey(neighbor)) { |
| 36 | + nodeMap[neighbor] = Node(neighbor.`val`) |
| 37 | + queue.add(neighbor) |
| 38 | + } |
| 39 | + |
| 40 | + // ๋ณต์ ๋ ํ์ฌ ๋
ธ๋์ ์ด์ ๋ฆฌ์คํธ์ ๋ณต์ ๋ ์ด์ ๋
ธ๋๋ฅผ ์ถ๊ฐ |
| 41 | + // ์๋ฐฉํฅ์ ๋ฐ์ง ํ์ ์์ด ๋ด๋ถ neighbor node list์ ๋ชจ๋ ๋
ธ๋๊ฐ ์์ |
| 42 | + clonedNode.neighbors.add(nodeMap[neighbor]) |
| 43 | + } |
| 44 | + } |
| 45 | + return nodeMap[node] |
| 46 | +} |
| 47 | + |
0 commit comments