Skip to content

Commit 6a624af

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 04f7c0e + f0b4b5e commit 6a624af

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+3076
-6
lines changed

โ€Žclone-graph/Chaedie.pyโ€Ž

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
ํ•œ๋ฒˆ์— ํ’€์ง€ ๋ชปํ•ด ๋‹ค์‹œ ํ’€์–ด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
3+
4+
Solution:
5+
1) oldToNew ๋ผ๋Š” dict ๋ฅผ ๋งŒ๋“ค์–ด ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
6+
2) newNode = Node(node.val), newNode.neighbors.append(dfs(nei)) ๋ฅผ ํ†ตํ•ด clone์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
7+
8+
์ •์  V, ๊ฐ„์„  E
9+
Time: O(V + E)
10+
Space: O(V + E)
11+
"""
12+
13+
14+
class Solution:
15+
def cloneGraph(self, root: Optional["Node"]) -> Optional["Node"]:
16+
if not root:
17+
return None
18+
oldToNew = {}
19+
20+
def dfs(node):
21+
if node in oldToNew:
22+
return oldToNew[node]
23+
24+
newNode = Node(node.val)
25+
oldToNew[node] = newNode
26+
27+
for nei in node.neighbors:
28+
newNode.neighbors.append(dfs(nei))
29+
30+
return newNode
31+
32+
return dfs(root)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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+

โ€Žclone-graph/dusunax.pyโ€Ž

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
'''
2+
# 133. Clone Graph
3+
This is the problem for copying nodes, which helps you understand the concept of referencing a node & copying the node (creating a new node from the existing one).
4+
5+
๐Ÿ‘‰ Perform recursion DFS with the correct escape condition and handling of NoneType.
6+
'''
7+
8+
"""
9+
# Definition for a Node.
10+
class Node:
11+
def __init__(self, val = 0, neighbors = None):
12+
self.val = val
13+
self.neighbors = neighbors if neighbors is not None else []
14+
"""
15+
from typing import Optional
16+
class Solution:
17+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
18+
if node is None:
19+
return None
20+
21+
visited = {}
22+
23+
def DFS(currNode):
24+
if currNode.val in visited:
25+
return visited[currNode.val]
26+
27+
copiedNode = Node(currNode.val)
28+
visited[currNode.val] = copiedNode
29+
30+
for neighbor in currNode.neighbors:
31+
copiedNode.neighbors.append(DFS(neighbor))
32+
33+
return copiedNode
34+
35+
return DFS(node)

โ€Žclone-graph/ekgns33.javaโ€Ž

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
// Definition for a Node.
3+
class Node {
4+
public int val;
5+
public List<Node> neighbors;
6+
public Node() {
7+
val = 0;
8+
neighbors = new ArrayList<Node>();
9+
}
10+
public Node(int _val) {
11+
val = _val;
12+
neighbors = new ArrayList<Node>();
13+
}
14+
public Node(int _val, ArrayList<Node> _neighbors) {
15+
val = _val;
16+
neighbors = _neighbors;
17+
}
18+
}
19+
*/
20+
21+
class Solution {
22+
public Node cloneGraph(Node node) {
23+
Map<Integer, Node> nodeMap = new HashMap<>();
24+
if(node == null) return null;
25+
boolean[] visited = new boolean[101];
26+
dfsHelper(nodeMap, node, visited);
27+
return nodeMap.get(1);
28+
}
29+
30+
private void dfsHelper(Map<Integer, Node> map, Node node, boolean[] visited) {
31+
if(!map.containsKey(node.val)) {
32+
map.put(node.val, new Node(node.val));
33+
}
34+
visited[node.val] = true;
35+
Node cur = map.get(node.val);
36+
for(Node adjacent : node.neighbors) {
37+
map.putIfAbsent(adjacent.val, new Node(adjacent.val));
38+
cur.neighbors.add(map.get(adjacent.val));
39+
if(!visited[adjacent.val]) dfsHelper(map, adjacent, visited);
40+
}
41+
}
42+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// ๋ฌธ์ œ ์˜๋„๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Œ. ๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ๋œ Node๋ฅผ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.
2+
// DFS๋กœ ํ’€๋ฉด ๋˜๊ณ , BFS๋„ ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ BFS๋Š” ๊นŒ๋”ฑ ์ž˜๋ชปํ•˜๋ฉด ํƒ€์ž„์•„์›ƒ์ด ๋‚˜์„œ ๊ทธ๋ƒฅ DFS๋กœ ํ•ด๊ฒฐ
3+
class Solution {
4+
private Map<Node, Node> visited = new HashMap<>();
5+
6+
public Node cloneGraph(Node node) {
7+
if (node == null) return null;
8+
9+
if (visited.containsKey(node)) {
10+
return visited.get(node);
11+
}
12+
13+
Node cloneNode = new Node(node.val);
14+
visited.put(node, cloneNode);
15+
16+
for (Node neighbor : node.neighbors) {
17+
cloneNode.neighbors.add(cloneGraph(neighbor));
18+
}
19+
20+
return cloneNode;
21+
}
22+
}

โ€Žclone-graph/pmjuu.pyโ€Ž

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
'''
2+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(V + E)
3+
- ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(V)
4+
- ๊ฐ ๋…ธ๋“œ์˜ ๋ชจ๋“  ๊ฐ„์„ ์„ ํ•œ ๋ฒˆ์”ฉ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(E)
5+
- ๋”ฐ๋ผ์„œ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V + E)
6+
7+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(V + E)
8+
- ํด๋ก  ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ(clones): O(V)
9+
- BFS ํƒ์ƒ‰์„ ์œ„ํ•œ ํ(queue): O(V)
10+
- ๋ณต์ œ๋œ ๊ทธ๋ž˜ํ”„์˜ ๋…ธ๋“œ์™€ ๊ฐ„์„  ์ €์žฅ ๊ณต๊ฐ„: O(V + E)
11+
'''
12+
13+
from typing import Optional
14+
from collections import deque
15+
# Definition for a Node.
16+
class Node:
17+
def __init__(self, val = 0, neighbors = None):
18+
self.val = val
19+
self.neighbors = neighbors if neighbors is not None else []
20+
21+
class Solution:
22+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
23+
if not node:
24+
return None
25+
26+
clones = { node.val: Node(node.val) }
27+
queue = deque([node])
28+
29+
while queue:
30+
current_node = queue.popleft()
31+
32+
for neighbor in current_node.neighbors:
33+
# add neighbors
34+
if neighbor.val not in clones.keys():
35+
queue.append(neighbor)
36+
clones[neighbor.val] = Node(neighbor.val)
37+
38+
clones[current_node.val].neighbors.append(clones[neighbor.val])
39+
40+
return clones[node.val]

โ€Žclone-graph/sungjinwi.pyโ€Ž

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
ํ’€์ด :
3+
์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด์„œ dfsํ’€์ด
4+
node๋ฅผ ๋ณต์ œํ•˜๊ณ  ๋…ธ๋“œ์˜ ์ด์›ƒ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์žฌ๊ท€ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์™„์„ฑํ•œ๋‹ค
5+
6+
clones ๋”•์…”๋„ˆ๋ฆฌ์— ์ด๋ฏธ ๋ณต์‚ฌ๋œ node๋“ค์„ ์ €์žฅํ•ด์„œ ์ด๋ฏธ ๋ณต์ œ๋œ node์— ๋Œ€ํ•ด
7+
ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ”๋กœ return
8+
9+
๋…ธ๋“œ์˜ ์ˆ˜ : V(์ •์  : Vertex) ์ด์›ƒ์˜ ์ˆ˜ : E(๊ฐ„์„  : Edge)๋ผ๊ณ  ํ•  ๋•Œ
10+
11+
TC : O(V + E)
12+
๋…ธ๋“œ์™€ ์ด์›ƒ์— ๋Œ€ํ•ด์„œ ์ˆœํšŒํ•˜๋ฏ€๋กœ
13+
14+
SC : O(V + E)
15+
ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๊ฐ€ ๋…ธ๋“œ์˜ ์ˆ˜์— ๋น„๋ก€ํ•ด์„œ ์ปค์ง€๊ณ 
16+
dfs์˜ ํ˜ธ์ถœ์Šคํƒ์€ ์ด์›ƒ์˜ ์ˆ˜๋งŒํผ ์Œ“์ด๋ฏ€๋กœ
17+
"""
18+
19+
"""
20+
# Definition for a Node.
21+
class Node:
22+
def __init__(self, val = 0, neighbors = None):
23+
self.val = val
24+
self.neighbors = neighbors if neighbors is not None else []
25+
"""
26+
from typing import Optional
27+
28+
class Solution:
29+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
30+
if not node :
31+
return None
32+
33+
clones = {}
34+
35+
def dfs(node : Optional['Node']) -> Optional['Node']:
36+
if node in clones :
37+
return clones[node]
38+
clone = Node(node.val)
39+
clones[node] = clone
40+
for nei in node.neighbors :
41+
clone.neighbors.append(dfs(nei))
42+
return clone
43+
44+
return dfs(node)

โ€Žclone-graph/yolophg.pyโ€Ž

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Time Complexity: O(N + E) - visit each node once and for each node, we iterate through its neighbors O(E).
2+
# Space Complexity: O(N) - store a copy of each node in the hashmap O(N).
3+
4+
class Solution:
5+
def cloneGraph(self, node):
6+
if node is None:
7+
return None
8+
9+
# dictionary to keep track of cloned nodes (original -> clone)
10+
mp = {}
11+
12+
def clone(node):
13+
if node in mp:
14+
# if the node has already been cloned, return the copy
15+
return mp[node]
16+
17+
# create a new node with the same value
18+
cpy = Node(node.val)
19+
# store it in the map so don't clone it again
20+
mp[node] = cpy
21+
22+
# clone all neighbors and add them to the new node's neighbors list
23+
for n in node.neighbors:
24+
cpy.neighbors.append(clone(n))
25+
26+
return cpy
27+
28+
return clone(node)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
Solution:
3+
1) ์ˆœํšŒํ•˜๋ฉฐ ์ด์ „ ๊ฐ’์ด ํ˜„์žฌ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ด ์ตœ์†Œ๊ฐ’์ด๋‹ค.
4+
2) ๋๊นŒ์ง€ ๋Œ์•„๋„ ์ตœ์†Œ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ์ฒซ๋ฒˆ์จฐ ๊ฐ’์ด ์ตœ์†Œ๊ฐ’์ด๋‹ค.
5+
Time: O(n)
6+
Space: O(1)
7+
"""
8+
9+
10+
class Solution:
11+
def findMin(self, nums: List[int]) -> int:
12+
for i in range(1, len(nums)):
13+
if nums[i - 1] >= nums[i]:
14+
return nums[i]
15+
16+
return nums[0]
17+
18+
"""
19+
Solution:
20+
์‹œ๊ฐ„ ๋ณต์žก๋„ O(log n)์œผ๋กœ ํ’€๊ธฐ ์œ„ํ•ด binary search ์‚ฌ์šฉ
21+
Time: O(log n)
22+
Space: O(1)
23+
"""
24+
25+
def findMin(self, nums: List[int]) -> int:
26+
l, r = 1, len(nums) - 1
27+
28+
while l <= r:
29+
mid = (l + r) // 2
30+
# prev ๊ฐ’๋ณด๋‹ค mid ๊ฐ€ ์ž‘์œผ๋ฉด ์ฐพ๋˜ ๊ฐ’
31+
if nums[mid - 1] > nums[mid]:
32+
return nums[mid]
33+
# mid ๊นŒ์ง€ ์ •์ƒ ์ˆœ์„œ๋ฉด ์šฐ์ธก ํƒ์ƒ‰
34+
if nums[0] < nums[mid]:
35+
l = mid + 1
36+
# mid ๊นŒ์ง€ ๋น„ ์ •์ƒ ์ˆœ์„œ๋ฉด ์ขŒ์ธก ํƒ์ƒ‰
37+
else:
38+
r = mid - 1
39+
# ๋ชป์ฐพ์„ ๊ฒฝ์šฐ ์ „์ฒด ์ •์ƒ ์ˆœ์„œ ์ผ€์ด์Šค
40+
return nums[0]
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""
2+
Constraints:
3+
- n == nums.length
4+
- 1 <= n <= 5000
5+
- -5000 <= nums[i] <= 5000
6+
- All the integers of nums are unique.
7+
- nums is sorted and rotated between 1 and n times.
8+
9+
Time Complexity: O(log n)
10+
- ์ด์ง„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ฆ
11+
12+
Space Complexity: O(1)
13+
- ์ถ”๊ฐ€ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ๋งŒ ์‚ฌ์šฉ
14+
15+
ํ’€์ด๋ฐฉ๋ฒ•:
16+
1. ์ด์ง„ ํƒ์ƒ‰(Binary Search) ํ™œ์šฉ
17+
2. mid์™€ right ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์กฐ๊ฑด์„ ๋‚˜๋ˆ”
18+
- Case 1: nums[mid] > nums[right]
19+
- ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ด ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์Œ
20+
- ์ตœ์†Ÿ๊ฐ’์€ mid ์˜ค๋ฅธ์ชฝ์— ์กด์žฌ
21+
- left = mid + 1
22+
- Case 2: nums[mid] <= nums[right]
23+
- mid๋ถ€ํ„ฐ right๊นŒ์ง€๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ์Œ
24+
- ์ตœ์†Ÿ๊ฐ’์€ mid๋ฅผ ํฌํ•จํ•œ ์™ผ์ชฝ์— ์กด์žฌ ๊ฐ€๋Šฅ
25+
- right = mid
26+
"""
27+
28+
class Solution:
29+
def findMin(self, nums: List[int]) -> int:
30+
left = 0
31+
right = len(nums) - 1
32+
33+
while left < right:
34+
mid = (left + right) // 2
35+
36+
if nums[mid] > nums[right]:
37+
left = mid + 1
38+
39+
else:
40+
right = mid
41+
42+
return nums[left]

0 commit comments

Comments
ย (0)