Skip to content

Commit 7d1ef57

Browse files
authored
Merge pull request #1091 from YeomChaeeun/main
2 parents 1ca5b8e + 2e444ee commit 7d1ef57

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* class TreeNode {
4+
* val: number
5+
* left: TreeNode | null
6+
* right: TreeNode | null
7+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8+
* this.val = (val===undefined ? 0 : val)
9+
* this.left = (left===undefined ? null : left)
10+
* this.right = (right===undefined ? null : right)
11+
* }
12+
* }
13+
*/
14+
/**
15+
* μ΄μ§„νŠΈλ¦¬ 레벨 순회 ν•˜κΈ°
16+
* μ•Œκ³ λ¦¬μ¦˜ λ³΅μž‘λ„
17+
* - μ‹œκ°„ λ³΅μž‘λ„: O(n)
18+
* - 곡간 λ³΅μž‘λ„: O(n)
19+
* @param root
20+
*/
21+
function levelOrder(root: TreeNode | null): number[][] {
22+
if(!root) return []
23+
let result = []
24+
const queue: TreeNode[] = [root]
25+
26+
while (queue.length > 0) {
27+
const levelValues: number[] = []
28+
29+
// ν˜„μž¬ 레벨의 크기 (ν˜„μž¬ 큐에 μžˆλŠ” ν˜„μž¬ λ ˆλ²¨μ— μ†ν•œ λ…Έλ“œμ˜ 수) 만큼 순회
30+
for (let i = 0; i < queue.length; i++) {
31+
const node = queue.shift()!
32+
33+
// ν˜„μž¬ λ…Έλ“œμ˜ 값을 ν˜„μž¬ 레벨의 κ°’ 배열에 μΆ”κ°€
34+
levelValues.push(node.val)
35+
36+
if (node.left) {
37+
queue.push(node.left);
38+
}
39+
if (node.right) {
40+
queue.push(node.right);
41+
}
42+
}
43+
44+
result.push(levelValues)
45+
}
46+
47+
return result;
48+
}

β€Žcounting-bits/YeomChaeeun.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* μ΄μ§„μˆ˜μ—μ„œ 1의 개수 μ„ΈκΈ° μ•Œκ³ λ¦¬μ¦˜
3+
* μ•Œκ³ λ¦¬μ¦˜ λ³΅μž‘λ„
4+
* - μ‹œκ°„ λ³΅μž‘λ„: O(n * log n)
5+
* - 곡간 λ³΅μž‘λ„: O(n)
6+
*/
7+
function countBits(n: number): number[] {
8+
const result: number[] = [];
9+
10+
// λΉ„νŠΈ 연산을 μ΄μš©ν•΄ 1의 개수λ₯Ό μ„ΈλŠ” ν•¨μˆ˜ - O(log n)
11+
function countOnes(num: number): number {
12+
let count = 0;
13+
while (num > 0) {
14+
num &= (num - 1); // κ°€μž₯ 였λ₯Έμͺ½μ˜ 1 λΉ„νŠΈλ₯Ό 제거
15+
count++;
16+
}
17+
return count;
18+
}
19+
20+
for (let i = 0; i <= n; i++) {
21+
result.push(countOnes(i));
22+
}
23+
24+
return result;
25+
}
26+
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
2+
/**
3+
* μ‹œκ°„ λ³΅μž‘λ„: O(nlogn) - sort λ©”μ†Œλ“œ
4+
*/
5+
// class MedianFinder {
6+
// arr: number[]
7+
// constructor() {
8+
// this.arr = [];
9+
// }
10+
11+
// addNum(num: number): void {
12+
// this.arr.push(num)
13+
// this.arr.sort((a, b) => a - b);
14+
// }
15+
16+
// findMedian(): number {
17+
// const len = this.arr.length;
18+
// const mid = Math.floor(len / 2);
19+
// if(len % 2) return this.arr[mid];
20+
// else return (this.arr[mid - 1] + this.arr[mid]) / 2;
21+
// }
22+
// }
23+
24+
/**
25+
* μ‹œκ°„ λ³΅μž‘λ„: O(log n) - νž™ μ—°μ‚°μ˜ μ‹œκ°„ λ³΅μž‘λ„
26+
* 곡간 λ³΅μž‘λ„: O(n) - n개의 숫자λ₯Ό μ €μž₯ν•˜λŠ” 데 ν•„μš”ν•œ 곡간
27+
*/
28+
class MedianFinder {
29+
maxHeap = new MaxPriorityQueue() // μ΅œλŒ€κ°’μ„ 트리의 λ£¨νŠΈμ— μœ„μΉ˜μ‹œν‚€λŠ” νž™
30+
minHeap = new MinPriorityQueue() // μ΅œμ†Œκ°’μ„ 트리의 λ£¨νŠΈμ— μœ„μΉ˜μ‹œν‚€λŠ” νž™
31+
size: number
32+
33+
constructor() {
34+
this.size = 0
35+
}
36+
37+
addNum(num: number): void {
38+
this.size++
39+
this.maxHeap.enqueue(num) // λ¨Όμ € μ΅œλŒ€ νž™μ— μΆ”κ°€
40+
const item = this.maxHeap.dequeue() // μ΅œλŒ€ νž™μ˜ μ΅œλŒ€κ°’ 제거
41+
this.minHeap.enqueue(item) // μ΅œμ†Œ νž™μ— μΆ”κ°€
42+
43+
// μ΅œμ†Œ νž™μ΄ 크면 μ΅œλŒ€ νž™μœΌλ‘œ 이동
44+
if (this.minHeap.size() > this.maxHeap.size()+1) {
45+
const item = this.minHeap.dequeue()
46+
this.maxHeap.enqueue(item)
47+
}
48+
}
49+
50+
findMedian(): number {
51+
if (this.size % 2 !== 0) {
52+
// μ΅œμ†Œ νž™μ˜ μ΅œμ†Œκ°’
53+
return this.minHeap.front()
54+
} else {
55+
// μ΅œλŒ€ νž™μ˜ μ΅œλŒ€κ°’(root)κ³Ό μ΅œμ†Œ νž™μ˜ μ΅œμ†Œκ°’(root)의 평균
56+
return (this.maxHeap.front() + this.minHeap.front()) / 2
57+
}
58+
}
59+
}
60+
/**
61+
* Your MedianFinder object will be instantiated and called as such:
62+
* var obj = new MedianFinder()
63+
* obj.addNum(num)
64+
* var param_2 = obj.findMedian()
65+
*/

0 commit comments

Comments
Β (0)