Skip to content

Commit c47dcb1

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 2d3019a + 3569df5 commit c47dcb1

31 files changed

Lines changed: 898 additions & 0 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from collections import deque
2+
3+
# Definition for a binary tree node.
4+
# class TreeNode:
5+
# def __init__(self, val=0, left=None, right=None):
6+
# self.val = val
7+
# self.left = left
8+
# self.right = right
9+
class Solution:
10+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
11+
answer = []
12+
13+
q = deque([(root, 0)])
14+
15+
while q:
16+
node, depth = q.popleft()
17+
if not node:
18+
continue
19+
20+
if len(answer)-1 < depth:
21+
answer.append([])
22+
23+
answer[depth].append(node.val)
24+
25+
q.append((node.left, depth+1))
26+
q.append((node.right, depth+1))
27+
28+
return answer
29+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
''''
2+
Time Complexity: O(N)
3+
- 모든 노드를 한 번씩 방문하므로 O(N)
4+
5+
Space Complexity: O(N)
6+
- 결과를 저장하기 위해 values 리스트와 큐에 최대 N개의 노드가 저장
7+
'''
8+
from collections import deque
9+
10+
class Solution:
11+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
12+
result = []
13+
14+
if not root:
15+
return result
16+
17+
queue = deque([root])
18+
19+
while queue:
20+
values = []
21+
for _ in range(len(queue)): # 같은 레벨에 있는 노드를 함께 처리
22+
node = queue.popleft()
23+
values.append(node.val)
24+
if node.left:
25+
queue.append(node.left)
26+
if node.right:
27+
queue.append(node.right)
28+
29+
result.append(values)
30+
31+
return result
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// BFS 구현
2+
// null 처리 잘 확인할 것...
3+
class Solution {
4+
public List<List<Integer>> levelOrder(TreeNode root) {
5+
List<List<Integer>> result = new ArrayList<>();
6+
if (root == null) return result;
7+
8+
Queue<TreeNode> queue = new LinkedList<>();
9+
queue.offer(root);
10+
11+
while(!queue.isEmpty()) {
12+
int size = queue.size();
13+
List<Integer> level = new ArrayList<>();
14+
15+
for (int i = 0; i < size; i++) {
16+
TreeNode cur = queue.poll();
17+
level.add(cur.val);
18+
19+
if (cur.left != null) queue.offer(cur.left);
20+
if (cur.right != null) queue.offer(cur.right);
21+
}
22+
result.add(level);
23+
}
24+
return result;
25+
}
26+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
8+
9+
# idea: BFS
10+
# Time Complexity: O(n)
11+
from collections import deque
12+
class Solution:
13+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
14+
ans = []
15+
q = deque([root])
16+
while q:
17+
level = []
18+
for i in range(len(q)):
19+
node = q.popleft()
20+
if node:
21+
level.append(node.val)
22+
if node.left:
23+
q.append(node.left)
24+
if node.right:
25+
q.append(node.right)
26+
if level:
27+
ans.append(level)
28+
return ans
29+
30+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from collections import deque, defaultdict
2+
from typing import Optional, List
3+
4+
# Definition for a binary tree node.
5+
class TreeNode:
6+
def __init__(self, val=0, left=None, right=None):
7+
self.val = val
8+
self.left = left
9+
self.right = right
10+
11+
class Solution:
12+
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
13+
# 앞으로의 코드는 root가 있다는 것을 전제로 수행
14+
# 또한 root가 None이라면 기록해서 돌려 줄 값도 없기 때문에 early return
15+
if not root:
16+
return []
17+
18+
# depth별 노드를 기록할 defaultdict
19+
nodes = defaultdict(list)
20+
# bfs 탐색에 사용될 queue
21+
queue = deque()
22+
23+
# root는 존재함이 보장되므로, 반복문의 시동을 위해 root node를 queue에 추가
24+
# 이 때 깊이 정보도 함께 묶어서 tuple로 추가
25+
queue.append((root, 0))
26+
27+
while queue:
28+
current = queue.popleft()
29+
30+
# 현재 노드의 값 기록
31+
nodes[current[1]].append(current[0].val)
32+
33+
# 현재 노드의 왼쪽 자식 노드가 존재한다면, 해당 노드와 깊이 정보를 함께 queue에 추가
34+
if current[0].left:
35+
queue.append((current[0].left, current[1] + 1))
36+
37+
# 현재 노드의 오른쪽 자식 노드가 존재한다면, 해당 노드와 깊이 정보를 함께 queue에 추가
38+
if current[0].right:
39+
queue.append((current[0].right, current[1] + 1))
40+
41+
# 깊이 순서대로 dict에 추가되었으므로, values()를 사용하여 리스트로 변환하여 반환
42+
return list(nodes.values())
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public List<List<Integer>> levelOrder(TreeNode root) {
3+
if(root == null) {
4+
return new ArrayList<>();
5+
}
6+
List<List<Integer>> list = new ArrayList<>();
7+
dfs(root, 0, list);
8+
return list;
9+
}
10+
11+
public void dfs(TreeNode node, int depth, List<List<Integer>> list) {
12+
if(list.size() == depth) {
13+
list.add(new ArrayList<>());
14+
}
15+
16+
List<Integer> dest = list.get(depth);
17+
dest.add(node.val);
18+
19+
if(node.left != null) {
20+
dfs(node.left, depth + 1, list);
21+
}
22+
23+
if(node.right != null) {
24+
dfs(node.right, depth + 1, list);
25+
}
26+
}
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
vector<vector<int>> ans;
15+
void rec(TreeNode* curr, int level) {
16+
if(ans.size() < level)
17+
ans.push_back(vector<int>());
18+
ans[level - 1].push_back(curr->val);
19+
if(curr->left)
20+
rec(curr->left, level + 1);
21+
if(curr->right)
22+
rec(curr->right, level + 1);
23+
}
24+
vector<vector<int>> levelOrder(TreeNode* root) {
25+
if(root)
26+
rec(root, 1);
27+
return ans;
28+
}
29+
};
30+

counting-bits/8804who.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import math
2+
3+
class Solution:
4+
def countBits(self, n: int) -> List[int]:
5+
dp = [0, 1]
6+
num = 1
7+
idx = 2
8+
9+
while idx <= n:
10+
num *= 2
11+
temp = idx+(num//2)
12+
temp2 = temp+(num//2)
13+
14+
for i in range(idx, temp):
15+
dp.append(dp[i-(num//2)])
16+
idx += 1
17+
for i in range(temp,temp2):
18+
dp.append(dp[i-(num//2)]+1)
19+
idx += 1
20+
21+
return dp[:n+1]
22+

counting-bits/hjeomdev.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public int[] countBits(int n) {
3+
// 0 ~ n 까지 2진수를 구하고, 그 수의 모든 자릿값의 합을 구해야함
4+
5+
int[] result = new int[n + 1];
6+
7+
for (int i = 0; i <= n; i++) {
8+
String binaryString = Integer.toBinaryString(i);
9+
int sum = 0;
10+
for (int j = 0 ; j < binaryString.length(); j++) {
11+
sum += binaryString.charAt(j) - '0';
12+
}
13+
result[i] = sum;
14+
}
15+
16+
return result;
17+
}
18+
}

counting-bits/juhui-jeong.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
3+
class Solution {
4+
public int[] countBits(int n) {
5+
ArrayList<Integer> list = new ArrayList<>();
6+
7+
for (int i = 0; i <= n; i++) {
8+
int result = i;
9+
int cnt = 0;
10+
11+
while(result > 0) {
12+
cnt += result%2;
13+
result /= 2;
14+
}
15+
16+
list.add(cnt);
17+
}
18+
int[] ans = new int[list.size()];
19+
for (int i = 0; i < list.size(); i++) {
20+
ans[i] = list.get(i);
21+
}
22+
return ans;
23+
}
24+
}

0 commit comments

Comments
 (0)