Skip to content

Commit d99662c

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents c7db4da + 1ba4be0 commit d99662c

Some content is hidden

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

72 files changed

+2254
-1
lines changed

clone-graph/Geegong.java

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import java.util.*;
2+
3+
/*
4+
// Definition for a Node.
5+
class Node {
6+
public int val;
7+
public List<Node> neighbors;
8+
public Node() {
9+
val = 0;
10+
neighbors = new ArrayList<Node>();
11+
}
12+
public Node(int _val) {
13+
val = _val;
14+
neighbors = new ArrayList<Node>();
15+
}
16+
public Node(int _val, ArrayList<Node> _neighbors) {
17+
val = _val;
18+
neighbors = _neighbors;
19+
}
20+
}
21+
*/
22+
public class Geegong {
23+
24+
/**
25+
* dfs 방식으로 풀이
26+
* visited 로 memoization 하여 방문해서 복사가 된 노드들을 저장
27+
* 한번 방문했던 노드를 neighbors 탐색을 통해 또 방문하게 되면 visited 에서 꺼내서 return 하도록 한다.
28+
*
29+
* time complexity : O(2N) -> O(N)
30+
* space complexity : O(N)
31+
* @param node
32+
* @return
33+
*/
34+
public Node cloneGraph(Node node) {
35+
// node에 진입한 순간에 바로 visited 에 넣어서 cloned 된 node 들을 집어넣도록 관리
36+
Map<Integer, Node> visited = new HashMap<>();
37+
38+
if (node == null) {
39+
return null;
40+
}
41+
42+
Node result = cloneDeeply(node, visited);
43+
return result;
44+
}
45+
46+
public Node cloneDeeply(Node origin, Map<Integer, Node> visited) {
47+
48+
// visited 에는 cloned 된 node 들을 저장하고 있어 한번 방문했던 노드라면 복사한 노드를 리턴한다.
49+
if (visited.containsKey(origin.val)) {
50+
return visited.get(origin.val);
51+
}
52+
53+
Node clonedTarget = new Node(origin.val);
54+
visited.put(origin.val, clonedTarget);
55+
56+
for (Node neighbor : origin.neighbors) {
57+
Node clonedNeighbor = cloneDeeply(neighbor, visited);
58+
clonedTarget.neighbors.add(clonedNeighbor);
59+
}
60+
61+
return clonedTarget;
62+
}
63+
64+
65+
// 이미 다른 분들이 Node 클래스를 많이 만들어놓으셔서.. 개인 클래스 안에 이너 클래스로 Node 만듬
66+
public static class Node {
67+
public int val;
68+
public List<Node> neighbors;
69+
public Node() {
70+
val = 0;
71+
neighbors = new ArrayList<Node>();
72+
}
73+
public Node(int _val) {
74+
val = _val;
75+
neighbors = new ArrayList<Node>();
76+
}
77+
public Node(int _val, ArrayList<Node> _neighbors) {
78+
val = _val;
79+
neighbors = _neighbors;
80+
}
81+
}
82+
}
83+
84+

clone-graph/delight010.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
// Time O(V+E)
3+
// Space O(V)
4+
func cloneGraph(_ node: Node?) -> Node? {
5+
guard let node = node else { return nil }
6+
7+
var visited: [Int: Node] = [:]
8+
var queue: [Node] = []
9+
10+
let firstNode = Node(node.val)
11+
visited[node.val] = firstNode
12+
13+
queue.append(node)
14+
15+
while !queue.isEmpty {
16+
let currentNode = queue.removeFirst()
17+
18+
for neighbor in currentNode.neighbors {
19+
guard let neighbor = neighbor else { continue }
20+
21+
if let clonedNeighbor = visited[neighbor.val] {
22+
visited[currentNode.val]!.neighbors.append(clonedNeighbor)
23+
} else {
24+
visited[neighbor.val] = Node(neighbor.val)
25+
visited[currentNode.val]!.neighbors.append(visited[neighbor.val])
26+
queue.append(neighbor)
27+
}
28+
}
29+
}
30+
31+
return firstNode
32+
}
33+
}
34+

clone-graph/hu6r1s.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
# Definition for a Node.
3+
class Node:
4+
def __init__(self, val = 0, neighbors = None):
5+
self.val = val
6+
self.neighbors = neighbors if neighbors is not None else []
7+
"""
8+
9+
from typing import Optional
10+
class Solution:
11+
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
12+
if not node:
13+
return None
14+
15+
visited = [None] * 101
16+
17+
def dfs(n):
18+
if visited[n.val] is not None:
19+
return visited[n.val]
20+
21+
copy = Node(n.val, [])
22+
visited[n.val] = copy
23+
24+
for nei in n.neighbors:
25+
copy.neighbors.append(dfs(nei))
26+
return copy
27+
28+
return dfs(node)

clone-graph/hyer0705.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Definition for _Node.
3+
* class _Node {
4+
* val: number
5+
* neighbors: _Node[]
6+
*
7+
* constructor(val?: number, neighbors?: _Node[]) {
8+
* this.val = (val===undefined ? 0 : val)
9+
* this.neighbors = (neighbors===undefined ? [] : neighbors)
10+
* }
11+
* }
12+
*
13+
*/
14+
15+
function cloneGraph(node: _Node | null): _Node | null {
16+
if (!node) return null;
17+
18+
const cloned = new Map<number, _Node>();
19+
20+
const queue: _Node[] = [];
21+
22+
const copied = new _Node(node.val);
23+
cloned.set(node.val, copied);
24+
25+
queue.push(node);
26+
27+
let pointer = 0;
28+
29+
while (pointer < queue.length) {
30+
const current = queue[pointer++];
31+
32+
const copiedNode = cloned.get(current.val)!;
33+
34+
for (const neighbor of current.neighbors) {
35+
if (!cloned.has(neighbor.val)) {
36+
const copiedNeighbor = new _Node(neighbor.val);
37+
cloned.set(neighbor.val, copiedNeighbor);
38+
39+
queue.push(neighbor);
40+
}
41+
copiedNode.neighbors.push(cloned.get(neighbor.val)!);
42+
}
43+
}
44+
45+
return copied;
46+
}

clone-graph/njngwn.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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+
HashMap<Node, Node> nodeMap = new HashMap<>(); // key: original Node, value: copied Node
23+
24+
public Node cloneGraph(Node node) {
25+
if (node == null) return null;
26+
27+
if (nodeMap.containsKey(node)) {
28+
return nodeMap.get(node);
29+
}
30+
31+
Node newNode = new Node(node.val);
32+
nodeMap.put(node, newNode);
33+
34+
for (Node neighborNode : node.neighbors) {
35+
newNode.neighbors.add(cloneGraph(neighborNode));
36+
}
37+
38+
return newNode;
39+
}
40+
}

clone-graph/sonjh1217.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Definition for a Node.
3+
* public class Node {
4+
* public var val: Int
5+
* public var neighbors: [Node?]
6+
* public init(_ val: Int) {
7+
* self.val = val
8+
* self.neighbors = []
9+
* }
10+
* }
11+
*/
12+
13+
class Solution {
14+
// O(V+E) time / O(V) space
15+
func cloneGraph(_ node: Node?) -> Node? {
16+
guard let node = node else {
17+
return nil
18+
}
19+
var newNodeByVal = [Int: Node]()
20+
return copy(node: node, newNodeByVal: &newNodeByVal)
21+
}
22+
23+
func copy(node: Node, newNodeByVal: inout [Int: Node]) -> Node {
24+
if let node = newNodeByVal[node.val] {
25+
return node
26+
}
27+
var newNode = Node(node.val)
28+
newNodeByVal[node.val] = newNode
29+
30+
for neighbor in node.neighbors {
31+
guard let neighbor = neighbor else {
32+
continue
33+
}
34+
let newNeighbor = copy(node: neighbor, newNodeByVal: &newNodeByVal)
35+
newNode.neighbors.append(newNeighbor)
36+
}
37+
return newNode
38+
}
39+
}

clone-graph/yhkee0404.scala

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import scala.collection.mutable.ListBuffer
2+
3+
/**
4+
* Definition for a Node.
5+
* class Node(var _value: Int) {
6+
* var value: Int = _value
7+
* var neighbors: List[Node] = List()
8+
* }
9+
*/
10+
11+
object Solution {
12+
def cloneGraph(graph: Node): Node = {
13+
if (graph == null) {
14+
return null
15+
}
16+
val dp = Array.fill[Node](101)(null)
17+
cloneGraph(dp, graph)
18+
}
19+
def cloneGraph(dp: Array[Node], graph: Node): Node = {
20+
if (dp(graph.value) != null) {
21+
return dp(graph.value)
22+
}
23+
val u = Node(graph.value)
24+
dp(graph.value) = u
25+
val neighbors = ListBuffer[Node]()
26+
graph.neighbors
27+
.foreach {
28+
neighbors += cloneGraph(dp, _)
29+
}
30+
u.neighbors ++= neighbors
31+
u
32+
}
33+
}

linked-list-cycle/hyer0705.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* class ListNode {
4+
* val: number
5+
* next: ListNode | null
6+
* constructor(val?: number, next?: ListNode | null) {
7+
* this.val = (val===undefined ? 0 : val)
8+
* this.next = (next===undefined ? null : next)
9+
* }
10+
* }
11+
*/
12+
13+
function hasCycle(head: ListNode | null): boolean {
14+
if (!head || !head.next) return false;
15+
16+
let slow = head;
17+
let fast = head;
18+
while (fast && fast.next) {
19+
slow = slow.next;
20+
fast = fast.next.next;
21+
if (slow === fast) return true;
22+
}
23+
24+
return false;
25+
}

0 commit comments

Comments
 (0)