Skip to content

Commit 94133fa

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 376bd25 + 2c7c2f8 commit 94133fa

File tree

112 files changed

+4260
-0
lines changed

Some content is hidden

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

112 files changed

+4260
-0
lines changed

alien-dictionary/PDKhan.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
class Solution {
2+
public:
3+
string alienOrder(vector<string> &words) {
4+
// Write your code here
5+
unordered_map<char, unordered_set<char>> graph;
6+
unordered_map<char, int> indegree;
7+
unordered_set<char> all_chars;
8+
9+
for (const string& word : words) {
10+
for (char c : word) {
11+
all_chars.insert(c);
12+
if (!indegree.count(c))
13+
indegree[c] = 0;
14+
}
15+
}
16+
17+
for(int i = 0; i < words.size() - 1; i++){
18+
string word1 = words[i];
19+
string word2 = words[i + 1];
20+
int len = min(word1.size(), word2.size());
21+
bool found = false;
22+
23+
for(int j = 0; j < len; j++){
24+
char ch1 = word1[j];
25+
char ch2 = word2[j];
26+
27+
if(ch1 != ch2){
28+
if(graph[ch1].count(ch2) == 0){
29+
graph[ch1].insert(ch2);
30+
indegree[ch2]++;
31+
}
32+
33+
found = true;
34+
break;
35+
}
36+
}
37+
38+
if(!found && word1.size() > word2.size())
39+
return "";
40+
}
41+
42+
queue<char> q;
43+
for(char c : all_chars){
44+
if(indegree[c] == 0)
45+
q.push(c);
46+
}
47+
48+
string order;
49+
50+
while(!q.empty()){
51+
char cur = q.front();
52+
q.pop();
53+
54+
order += cur;
55+
56+
for(char next : graph[cur]){
57+
if(--indegree[next] == 0)
58+
q.push(next);
59+
}
60+
}
61+
62+
if(order.size() != all_chars.size())
63+
return "";
64+
65+
return order;
66+
}
67+
};
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* [Problem]: [102] Binary Tree Level Order Traversal
3+
* (https://leetcode.com/problems/binary-tree-level-order-traversal/description/)
4+
*/
5+
6+
class TreeNode {
7+
val: number;
8+
left: TreeNode | null;
9+
right: TreeNode | null;
10+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
11+
this.val = val === undefined ? 0 : val;
12+
this.left = left === undefined ? null : left;
13+
this.right = right === undefined ? null : right;
14+
}
15+
}
16+
17+
// 시간복잡도 O(n)
18+
// 공간복잡도 O(n)
19+
function levelOrder(root: TreeNode | null): number[][] {
20+
if (!root) return [];
21+
22+
const result: number[][] = [];
23+
const queue: TreeNode[] = [root];
24+
25+
while (queue.length > 0) {
26+
const level = queue.length;
27+
const values: number[] = [];
28+
29+
for (let i = 0; i < level; i++) {
30+
const node = queue.shift()!;
31+
values.push(node.val);
32+
33+
if (node.left) queue.push(node.left);
34+
if (node.right) queue.push(node.right);
35+
}
36+
37+
result.push(values);
38+
}
39+
40+
return result;
41+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
class TreeNode {
2+
val: number
3+
left: TreeNode | null
4+
right: TreeNode | null
5+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6+
this.val = (val===undefined ? 0 : val)
7+
this.left = (left===undefined ? null : left)
8+
this.right = (right===undefined ? null : right)
9+
}
10+
}
11+
12+
13+
// TC: O(n)
14+
// SC: O(n)
15+
function levelOrder(root: TreeNode | null): number[][] {
16+
if (!root) return [];
17+
18+
const result: number[][] = [];
19+
const queue: TreeNode[] = [root];
20+
21+
while (queue.length > 0) {
22+
const values: number[] = [];
23+
const level = queue.length;
24+
25+
for (let i = 0; i < level; i++) {
26+
const node = queue.shift()!;
27+
values.push(node.val);
28+
29+
if (node.left) {
30+
queue.push(node.left);
31+
}
32+
33+
if (node.right) {
34+
queue.push(node.right);
35+
}
36+
}
37+
38+
result.push(values);
39+
}
40+
41+
return result;
42+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// 재귀 함수로 해결
2+
// 각 노드의 레벨을 기억하고있다가 정답변수에 레벨별로 노드값을 넣어줌
3+
class Solution {
4+
func levelOrder(_ root: TreeNode?) -> [[Int]] {
5+
var answer = [[Int]]()
6+
searchNodes(0, root, &answer)
7+
return answer
8+
}
9+
10+
func searchNodes(_ level: Int, _ node: TreeNode?, _ answer: inout [[Int]]) {
11+
guard let node else { return }
12+
if level >= answer.count { answer.append([]) }
13+
answer[level].append(node.val)
14+
searchNodes(level + 1, node.left, &answer)
15+
searchNodes(level + 1, node.right, &answer)
16+
}
17+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> levelOrder(TreeNode* root) {
4+
vector<vector<int>> result;
5+
6+
if(!root)
7+
return result;
8+
9+
queue<TreeNode*> q;
10+
11+
q.push(root);
12+
13+
while(!q.empty()){
14+
int len = q.size();
15+
vector<int> level;
16+
17+
for(int i = 0; i < len; i++){
18+
TreeNode* curr = q.front();
19+
q.pop();
20+
21+
if(curr->left)
22+
q.push(curr->left);
23+
24+
if(curr->right)
25+
q.push(curr->right);
26+
27+
level.push_back(curr->val);
28+
}
29+
30+
result.push_back(level);
31+
}
32+
33+
return result;
34+
}
35+
};
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import java.util.ArrayList;
2+
import java.util.LinkedList;
3+
import java.util.List;
4+
import java.util.Queue;
5+
6+
/**
7+
* Definition for a binary tree node.
8+
* public class TreeNode {
9+
* int val;
10+
* TreeNode left;
11+
* TreeNode right;
12+
* TreeNode() {}
13+
* TreeNode(int val) { this.val = val; }
14+
* TreeNode(int val, TreeNode left, TreeNode right) {
15+
* this.val = val;
16+
* this.left = left;
17+
* this.right = right;
18+
* }
19+
* }
20+
*/
21+
class Solution {
22+
23+
// DFS 풀이
24+
public List<List<Integer>> levelOrder(TreeNode root) {
25+
List<List<Integer>> result = new ArrayList<>();
26+
dfs(root, 0, result);
27+
return result;
28+
}
29+
30+
private void dfs(TreeNode node, int depth, List<List<Integer>> result) {
31+
if (node == null) {
32+
return;
33+
}
34+
35+
// 깊이만큼의 리스트가 없으면 새 리스트 추가하기
36+
if (depth == result.size()) {
37+
result.add(new ArrayList<>());
38+
}
39+
40+
result.get(depth).add(node.val);
41+
42+
dfs(node.left, depth + 1, result);
43+
dfs(node.right, depth + 1, result);
44+
45+
46+
}
47+
48+
// BFS로 풀이
49+
// O(n)
50+
// public List<List<Integer>> levelOrder(TreeNode root) {
51+
//
52+
// List<List<Integer>> result = new ArrayList<>();
53+
//
54+
// if (root == null) {
55+
// return result;
56+
// }
57+
//
58+
// Queue<TreeNode> queue = new LinkedList<>();
59+
// queue.offer(root);
60+
//
61+
// while (!queue.isEmpty()) {
62+
// int nodeCnt = queue.size();
63+
// List<Integer> currentLevelNodes = new ArrayList<>();
64+
//
65+
// for (int i = 0; i < nodeCnt; i++) {
66+
// TreeNode current = queue.poll();
67+
// currentLevelNodes.add(current.val);
68+
//
69+
// if (current.left != null) {
70+
// queue.offer(current.left);
71+
// }
72+
//
73+
// if (current.right != null) {
74+
// queue.offer(current.right);
75+
// }
76+
//
77+
// }
78+
//
79+
// result.add(currentLevelNodes);
80+
//
81+
// }
82+
//
83+
// return result;
84+
//
85+
// }
86+
}
87+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
queue를 활용해서 자식 노드의 수를 세고, 그만큼 반복문을 돌면서
3+
각 노드의 값을 저장하는 방식으로 깊이순 트리 순회를 구현
4+
트리의 모든 노드를 한 번씩 방문하므로 O(n)의 시간복잡도,
5+
트리의 모든 노드를 저장하므로 O(n)의 공간 복잡도를 가진다.
6+
*/
7+
class Solution {
8+
public:
9+
vector<vector<int>> levelOrder(TreeNode* root) {
10+
queue<TreeNode*> q;
11+
vector<vector<int>> ans;
12+
if (!root)
13+
return ans;
14+
15+
q.push(root);
16+
while (!q.empty()) {
17+
vector<int> tmp;
18+
int size = q.size();
19+
for (int i = 0; i < size; i++) {
20+
TreeNode* child = q.front();
21+
q.pop();
22+
tmp.push_back(child->val);
23+
if (child->left)
24+
q.push(child->left);
25+
if (child->right)
26+
q.push(child->right);
27+
}
28+
ans.push_back(tmp);
29+
}
30+
return ans;
31+
}
32+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// https://leetcode.com/problems/binary-tree-level-order-traversal/description/
2+
/**
3+
* Example:
4+
* var ti = TreeNode(5)
5+
* var v = ti.`val`
6+
* Definition for a binary tree node.
7+
* class TreeNode(var `val`: Int) {
8+
* var left: TreeNode? = null
9+
* var right: TreeNode? = null
10+
* }
11+
*/
12+
class Solution {
13+
fun levelOrder(root: TreeNode?): List<List<Int>> {
14+
val result = mutableListOf<List<Int>>()
15+
if(root == null) return result
16+
17+
val queue: ArrayDeque<TreeNode> = ArrayDeque()
18+
queue.add(root)
19+
20+
while (queue.isNotEmpty()) {
21+
val levelSize = queue.size
22+
val level = mutableListOf<Int>()
23+
repeat(levelSize) {
24+
val node = queue.removeFirst()
25+
level.add(node.`val`)
26+
node.left?.let { queue.add(it) }
27+
node.right?.let { queue.add(it) }
28+
}
29+
result.add(level)
30+
}
31+
return result
32+
}
33+
}

0 commit comments

Comments
 (0)