Skip to content

Commit 9d69741

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents dadf405 + b14e4d9 commit 9d69741

File tree

10 files changed

+348
-0
lines changed

10 files changed

+348
-0
lines changed

course-schedule/kayden.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from collections import deque
2+
class Solution:
3+
# 시간복잡도: O(numCourses + prerequisites의 길이)
4+
# 공간복잡도: O(numCourses + prerequisites의 길이)
5+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
6+
7+
reachable = [0 for _ in range(numCourses)]
8+
graph = [[] for _ in range(numCourses)]
9+
10+
for a, b in prerequisites:
11+
reachable[a] += 1
12+
graph[b].append(a)
13+
14+
q = deque()
15+
visited = set()
16+
for i in range(numCourses):
17+
if reachable[i] == 0:
18+
q.append(i)
19+
visited.add(i)
20+
21+
while q:
22+
node = q.popleft()
23+
24+
for next_node in graph[node]:
25+
reachable[next_node] -= 1
26+
if next_node not in visited and reachable[next_node] == 0:
27+
q.append(next_node)
28+
visited.add(next_node)
29+
30+
if len(visited) == numCourses:
31+
return True
32+
33+
return False

course-schedule/wogha95.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* TC: O(V + E)
3+
* SC: O(V + E)
4+
* N: numCourses(all of vertex), P: prerequisites(all of edge)
5+
*/
6+
7+
/**
8+
* @param {number} numCourses
9+
* @param {number[][]} prerequisites
10+
* @return {boolean}
11+
*/
12+
var canFinish = function (numCourses, prerequisites) {
13+
const STEP = {
14+
before: 0,
15+
ing: 1,
16+
after: 2,
17+
};
18+
const stepBoard = Array.from({ length: numCourses }, () => STEP.before);
19+
const board = Array.from({ length: numCourses }, () => []);
20+
21+
for (const [a, b] of prerequisites) {
22+
board[a].push(b);
23+
}
24+
25+
for (let index = 0; index < numCourses; index++) {
26+
if (isCycle(index)) {
27+
return false;
28+
}
29+
}
30+
return true;
31+
32+
function isCycle(current) {
33+
if (stepBoard[current] === STEP.end) {
34+
return false;
35+
}
36+
if (stepBoard[current] === STEP.ing) {
37+
return true;
38+
}
39+
40+
stepBoard[current] = STEP.ing;
41+
for (const next of board[current]) {
42+
if (isCycle(next)) {
43+
return true;
44+
}
45+
}
46+
stepBoard[current] = STEP.end;
47+
return false;
48+
}
49+
};

invert-binary-tree/gitsunmin.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* https://leetcode.com/problems/invert-binary-tree/
3+
* time complexity : O(n)
4+
* space complexity : O(log N)
5+
*/
6+
7+
class TreeNode {
8+
val: number
9+
left: TreeNode | null
10+
right: TreeNode | null
11+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
12+
this.val = (val === undefined ? 0 : val)
13+
this.left = (left === undefined ? null : left)
14+
this.right = (right === undefined ? null : right)
15+
}
16+
}
17+
18+
export const dfs = (root: TreeNode | null, inverted: TreeNode | null): TreeNode | null => {
19+
if (!root) return null;
20+
21+
const left = dfs(root.left, inverted);
22+
const right = dfs(root.right, inverted);
23+
24+
root.left = right;
25+
root.right = left;
26+
27+
return root;
28+
};
29+
30+
function invertTree(root: TreeNode | null): TreeNode | null {
31+
if (!root) return null;
32+
33+
return dfs(root, new TreeNode(0));
34+
};

invert-binary-tree/kayden.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution:
2+
# 시간복잡도: O(N)
3+
# 공간복잡도: O(1)
4+
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
5+
def invert(node):
6+
if not node:
7+
return
8+
9+
r = invert(node.left)
10+
l = invert(node.right)
11+
12+
node.right = r
13+
node.left = l
14+
15+
return node
16+
17+
invert(root)
18+
19+
return root

invert-binary-tree/wogha95.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* 양쪽 자식 노드 주소를 교환하고 dfs로 순회합니다.
3+
*
4+
* TC: O(N)
5+
* 모든 트리를 순회합니다.
6+
*
7+
* SC: O(N)
8+
* 최악의 경우 (한쪽으로 치우친 트리) N만큼 CallStack이 생깁니다.
9+
*
10+
* N: tree의 모든 node 수
11+
*/
12+
13+
/**
14+
* Definition for a binary tree node.
15+
* function TreeNode(val, left, right) {
16+
* this.val = (val===undefined ? 0 : val)
17+
* this.left = (left===undefined ? null : left)
18+
* this.right = (right===undefined ? null : right)
19+
* }
20+
*/
21+
/**
22+
* @param {TreeNode} root
23+
* @return {TreeNode}
24+
*/
25+
var invertTree = function (root) {
26+
if (!root) {
27+
return root;
28+
}
29+
[root.left, root.right] = [root.right, root.left];
30+
invertTree(root.left);
31+
invertTree(root.right);
32+
return root;
33+
};

jump-game/kayden.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
# 시간복잡도: O(N)
3+
# 공간복잡도: O(1)
4+
# 이 문제는 마지막 테케가 통과하지 않아서 답을 참고했습니다.
5+
def canJump(self, nums: List[int]) -> bool:
6+
7+
gas = 0
8+
for n in nums:
9+
if gas < 0:
10+
return False
11+
elif n > gas:
12+
gas = n
13+
gas -= 1
14+
15+
return True

jump-game/wogha95.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* TC: O(N)
3+
* SC: O(1)
4+
* N: nums.length
5+
*/
6+
7+
/**
8+
* @param {number[]} nums
9+
* @return {boolean}
10+
*/
11+
var canJump = function (nums) {
12+
if (nums.length === 1) {
13+
return true;
14+
}
15+
16+
let maximumIndex = 0;
17+
18+
for (let index = 0; index < nums.length; index++) {
19+
const jumpLength = nums[index];
20+
21+
if (jumpLength === 0) {
22+
continue;
23+
}
24+
25+
if (maximumIndex < index) {
26+
return false;
27+
}
28+
29+
maximumIndex = Math.max(maximumIndex, index + nums[index]);
30+
31+
if (maximumIndex >= nums.length - 1) {
32+
return true;
33+
}
34+
}
35+
36+
return false;
37+
};

merge-k-sorted-lists/kayden.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution:
2+
# 시간복잡도: O(NlogK) N: 모든 리스트의 노드 수 합 K: 리스트의 개수
3+
# 공간복잡도: O(1) 기존 노드 재활용
4+
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
5+
if not lists: return None
6+
if len(lists) == 1: return lists[0]
7+
8+
def merge(a, b):
9+
res = ListNode()
10+
cur = res
11+
12+
while a and b:
13+
if a.val > b.val:
14+
cur.next = b
15+
b = b.next
16+
else:
17+
cur.next = a
18+
a = a.next
19+
cur = cur.next
20+
21+
if a:
22+
cur.next = a
23+
else:
24+
cur.next = b
25+
26+
return res.next
27+
28+
def mergeK(lo, hi):
29+
if lo == hi:
30+
return lists[lo]
31+
32+
if hi - lo == 1:
33+
return merge(lists[lo], lists[hi])
34+
35+
mid = (lo + hi) // 2
36+
left = mergeK(lo, mid)
37+
right = mergeK(mid+1, hi)
38+
39+
return merge(left, right)
40+
41+
return mergeK(0, len(lists)-1)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution:
2+
# 시간복잡도: O(logN)
3+
# 공간복잡도: O(1)
4+
def search(self, nums: List[int], target: int) -> int:
5+
n = len(nums)
6+
st, en = 0, n-1
7+
while st <= en:
8+
mid = (st+en)//2
9+
if nums[mid] == target:
10+
return mid
11+
elif nums[mid] >= nums[st]:
12+
if nums[st] <= target <= nums[mid]:
13+
en = mid - 1
14+
else:
15+
st = mid + 1
16+
else:
17+
if nums[mid] <= target <= nums[en]:
18+
st = mid + 1
19+
else:
20+
en = mid - 1
21+
22+
return -1
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* 모든 케이스가 많지 않다고 생각되어 분기처리하였습니다..
3+
* 더 간결한 풀이법을 고려해보는 중..
4+
*
5+
* TC: O(log N)
6+
* 이진탐색을 이용하여 순회합니다.
7+
*
8+
* SC: O(1)
9+
* 이진탐색에 이용되는 투 포인터의 공간복잡도를 갖습니다.
10+
*/
11+
12+
/**
13+
* @param {number[]} nums
14+
* @param {number} target
15+
* @return {number}
16+
*/
17+
var search = function (nums, target) {
18+
if (nums.length === 1) {
19+
return target === nums[0] ? 0 : -1;
20+
}
21+
22+
let left = 0;
23+
let right = nums.length - 1;
24+
25+
while (left < right) {
26+
const center = Math.floor((left + right) / 2);
27+
if (target === nums[left]) {
28+
return left;
29+
}
30+
if (target === nums[center]) {
31+
return center;
32+
}
33+
if (target === nums[right]) {
34+
return right;
35+
}
36+
37+
if (nums[left] <= nums[center] && nums[center] < nums[right]) {
38+
if (target < nums[left] || nums[right] < target) {
39+
return -1;
40+
} else if (nums[left] < target && target < nums[center]) {
41+
right = center;
42+
} else if (nums[center] < target && target < nums[right]) {
43+
left = center + 1;
44+
}
45+
} else if (nums[right] < nums[left] && nums[left] <= nums[center]) {
46+
if (nums[right] < target && target < nums[left]) {
47+
return -1;
48+
} else if (nums[left] < target && target < nums[center]) {
49+
right = center;
50+
} else {
51+
left = center + 1;
52+
}
53+
} else if (nums[center] < nums[right] && nums[right] < nums[left]) {
54+
if (nums[center] < target && target < nums[right]) {
55+
left = center + 1;
56+
} else if (nums[right] < target && target < nums[left]) {
57+
return -1;
58+
} else {
59+
right = center;
60+
}
61+
}
62+
}
63+
64+
return -1;
65+
};

0 commit comments

Comments
 (0)