Skip to content

Commit db64cd4

Browse files
authored
Merge pull request #505 from obzva/main
[Flynn] Week 08
2 parents 2c92127 + 31e459a commit db64cd4

File tree

5 files changed

+319
-0
lines changed

5 files changed

+319
-0
lines changed

โ€Žclone-graph/flynn.cpp

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/**
2+
* ํ’€์ด
3+
* - BFS์™€ ํ•ด์‹œ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์ดํ•ฉ๋‹ˆ๋‹ค
4+
*
5+
* Big O
6+
* - N: ์ฃผ์–ด์ง„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
7+
* - E: ์ฃผ์–ด์ง„ ๋…ธ๋“œ์˜ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
8+
*
9+
* - Time complexity: O(E)
10+
* - ํ•œ Node์—์„œ ๋‹ค๋ฅธ Node๋กœ ํ–ฅํ•˜๋Š” ๋ชจ๋“  edge๋ฅผ ๋‘๋ฒˆ์”ฉ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค (๋‘ ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ)
11+
* - Space complexity: O(N)
12+
* - ํ•ด์‹œ๋งต์— ์ตœ๋Œ€ N๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
13+
*/
14+
15+
/*
16+
// Definition for a Node.
17+
class Node {
18+
public:
19+
int val;
20+
vector<Node*> neighbors;
21+
Node() {
22+
val = 0;
23+
neighbors = vector<Node*>();
24+
}
25+
Node(int _val) {
26+
val = _val;
27+
neighbors = vector<Node*>();
28+
}
29+
Node(int _val, vector<Node*> _neighbors) {
30+
val = _val;
31+
neighbors = _neighbors;
32+
}
33+
};
34+
*/
35+
36+
class Solution {
37+
public:
38+
Node* cloneGraph(Node* node) {
39+
if (node == nullptr) return nullptr;
40+
41+
unordered_map<Node*, Node*> node_map;
42+
node_map[node] = new Node(node->val);
43+
44+
queue<Node*> q;
45+
q.push(node);
46+
47+
while (!q.empty()) {
48+
Node* p = q.front();
49+
q.pop();
50+
51+
for (Node* neighbor : p->neighbors) {
52+
// ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š” ๋…ธ๋“œ์ผ ๊ฒฝ์šฐ
53+
if (node_map.find(neighbor) == node_map.end()) {
54+
// node_map์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ถ”๊ฐ€
55+
node_map[neighbor] = new Node(neighbor->val);
56+
57+
// ํ์— ์ถ”๊ฐ€
58+
q.push(neighbor);
59+
}
60+
61+
node_map[p]->neighbors.push_back(node_map[neighbor]);
62+
}
63+
}
64+
65+
return node_map[node];
66+
}
67+
};
+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/**
2+
* ํ’€์ด 1
3+
* - 2์ฐจ์› DP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์ดํ•ฉ๋‹ˆ๋‹ค
4+
* DP[i][j]: text1์˜ i๋ฒˆ์งธ ๋ฌธ์ž๊นŒ์ง€์™€ text2์˜ j๋ฒˆ์งธ ๋ฌธ์ž๊นŒ์ง€ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
5+
* ์ฆ‰, text1[0 .. i - 1]์™€ text2[0 .. j - 1]์˜ ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
6+
* DP[i][j] = if text1[i - 1] == text2[j - 1] then DP[i - 1][j - 1] + 1
7+
* else max(DP[i - 1][j], DP[i][j - 1])
8+
* - ํ’€์ด 2๋กœ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
9+
*
10+
* Big O
11+
* - M: text1์˜ ๊ธธ์ด
12+
* - N: text2์˜ ๊ธธ์ด
13+
*
14+
* - Time complexity: O(N * M)
15+
* - Space complexity: O(N * M)
16+
*/
17+
18+
class Solution {
19+
public:
20+
int longestCommonSubsequence(string text1, string text2) {
21+
size_t m = text1.size();
22+
size_t n = text2.size();
23+
24+
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
25+
26+
for (int i = 1; i <= m; ++i) {
27+
for (int j = 1; j <= n; ++j) {
28+
if (text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
29+
else dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
30+
}
31+
}
32+
33+
return dp[m][n];
34+
}
35+
};
36+
37+
/**
38+
* ํ’€์ด 2
39+
* - ํ’€์ด 1์˜ DP ์ „๊ฐœ ๊ณผ์ •์„ ๋ณด๋ฉด ์šฐ๋ฆฌํ•œํ…Œ๋Š” DP ๋ฐฐ์—ด ๋‘ ํ–‰๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
40+
*
41+
* Big O
42+
* - M: text1์˜ ๊ธธ์ด
43+
* - N: text2์˜ ๊ธธ์ด
44+
*
45+
* - M >= N์ด ๋˜๋„๋ก ๊ณ ๋ฆ…๋‹ˆ๋‹ค
46+
*
47+
* - Time complexity: O(N * M)
48+
* - Space complexity: O(N)
49+
*/
50+
51+
class Solution {
52+
public:
53+
int longestCommonSubsequence(string text1, string text2) {
54+
size_t m = text1.size();
55+
size_t n = text2.size();
56+
57+
if (m < n) return longestCommonSubsequence(text2, text1);
58+
59+
vector<int> dp1(n + 1, 0);
60+
vector<int> dp2(n + 1, 0);
61+
62+
for (int i = 1; i <= m; ++i) {
63+
for (int j = 1; j <= n; ++j) {
64+
if (text1[i - 1] == text2[j - 1]) dp2[j] = dp1[j - 1] + 1;
65+
else dp2[j] = max(dp1[j], dp2[j - 1]);
66+
}
67+
68+
if (i == m) break;
69+
70+
dp1.swap(dp2);
71+
dp2.clear();
72+
dp2.resize(n + 1, 0);
73+
}
74+
75+
return dp2[n];
76+
}
77+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/**
2+
* ํ’€์ด
3+
* - ์ฃผ์–ด์ง„ s๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด valid substring์˜ ๊ธธ์ด๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค
4+
* - valid substring: ์ตœ๋Œ€ k๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ๋ฐ”๊ฟ”์„œ, ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ๊ฐ™๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” substring
5+
*
6+
* - ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ํ’€์ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
7+
*
8+
* - 1. ํŠน์ • ๊ธธ์ด์˜ valid substring์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
9+
* - ํ•จ์ˆ˜ bool can_make_valid_substring(string const s, int substr_length, int k)
10+
* - ํŠน์ • ๊ธธ์ด์˜ substring์— ๋Œ€ํ•ด์„œ, ๋“ฑ์žฅ ๋นˆ๋„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฌธ์ž์˜ ๋นˆ๋„์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค (max_freq)
11+
* ๋งŒ์•ฝ ํ•ด๋‹น substring์ด valid substring์ด๋ผ๋ฉด, max_freq + k >= substr_length ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
12+
*
13+
* - 2. ์ตœ๋Œ€ ๊ธธ์ด์˜ valid substring์„ ์ฐพ๋Š”๋‹ค
14+
* - ์ด์ง„ํƒ์ƒ‰์„ ํ†ตํ•ด ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ฐพ๋Š”๋‹ค
15+
* - ํ•จ์ˆ˜ int characterReplacement(string s, int k)
16+
* - ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด s๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” substring์˜ ๊ธธ์ด๋Š” 1์ด์ƒ s.size() ์ดํ•˜์ž…๋‹ˆ๋‹ค
17+
* ์ด์ง„ ํƒ์ƒ‰์˜ ๋ฒ”์œ„๋ฅผ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์„ค์ •ํ•˜๊ณ , ํ˜„์žฌ ํƒ์ƒ‰ํ•˜๋ ค๋Š” ๊ธธ์ด (mid)์— ๋Œ€ํ•ด์„œ
18+
* can_make_valid_substring ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ๊ธธ์ด๋กœ valid substring์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
19+
* ์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ „๊ฐœ ๋ฐ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์„ค๋ช…์€ https://github.com/DaleStudy/leetcode-study/discussions/332๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” :)
20+
*
21+
* Big O
22+
* - N: ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด
23+
* - K: ์ฃผ์–ด์ง„ ์ •์ˆ˜ k
24+
*
25+
* - Time complexity: O(N * logN)
26+
* - Space complexity: O(1)
27+
*/
28+
29+
class Solution {
30+
public:
31+
bool can_make_valid_substring(string const s, int substr_length, int k) {
32+
// ๋ฌธ์ž์˜ ๋นˆ๋„์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค
33+
array<int, 26> freq;
34+
freq.fill(0);
35+
36+
// ์ตœ๋Œ€ ๋นˆ๋„์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค
37+
int max_freq = 0;
38+
39+
int window_start = 0;
40+
41+
for (int window_end = 0; window_end < s.size(); ++window_end) {
42+
++freq[s[window_end] - 'A'];
43+
44+
int curr_size = window_end - window_start + 1;
45+
if (curr_size > substr_length) {
46+
--freq[s[window_start] - 'A'];
47+
++window_start;
48+
}
49+
50+
max_freq = max(max_freq, freq[s[window_end] - 'A']);
51+
if (max_freq + k >= substr_length) return true;
52+
}
53+
54+
return false;
55+
}
56+
57+
int characterReplacement(string s, int k) {
58+
int lo = 1;
59+
int hi = s.size() + 1;
60+
while (lo < hi) {
61+
int mid = lo + (hi - lo) / 2;
62+
63+
if (can_make_valid_substring(s, mid, k)) lo = mid + 1;
64+
else hi = mid;
65+
}
66+
67+
// ์ด์ง„ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋˜๋ฉด lo๋Š” ์ตœ๋Œ€ ๊ธธ์ด๋ณด๋‹ค 1 ํฐ ๊ฐ’์ด ๋œ๋‹ค.
68+
// EX: hi lo
69+
// T T T T F F F F
70+
// ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ ๊ธธ์ด๋Š” lo - 1์ด ๋œ๋‹ค
71+
return lo - 1;
72+
}
73+
};

โ€Žmerge-two-sorted-lists/flynn.cpp

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* ํ’€์ด
3+
* - ์ฃผ์–ด์ง„ ๋‘ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ node๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ๋ฐ˜ํ™˜ํ•  ์ƒˆ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค
4+
*
5+
* Big O
6+
* - N: ์ฃผ์–ด์ง„ ๋‘ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ list1, list2์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜์˜ ์ดํ•ฉ
7+
*
8+
* - Time complexity: O(N)
9+
* - Space complexity: O(1)
10+
* - ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณต์žก๋„์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์„ ์‹œ, ๊ณต๊ฐ„๋ณต์žก๋„๋Š” N์— ์ƒ๊ด€ ์—†์ด ์ผ์ •ํ•ฉ๋‹ˆ๋‹ค
11+
*/
12+
13+
/**
14+
* Definition for singly-linked list.
15+
* struct ListNode {
16+
* int val;
17+
* ListNode *next;
18+
* ListNode() : val(0), next(nullptr) {}
19+
* ListNode(int x) : val(x), next(nullptr) {}
20+
* ListNode(int x, ListNode *next) : val(x), next(next) {}
21+
* };
22+
*/
23+
class Solution {
24+
public:
25+
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
26+
ListNode* head = new ListNode();
27+
ListNode* node = head;
28+
29+
ListNode* p = list1;
30+
ListNode* q = list2;
31+
32+
while (p != nullptr && q != nullptr) {
33+
if (p->val < q->val) {
34+
node->next = p;
35+
p = p->next;
36+
} else {
37+
node->next = q;
38+
q = q->next;
39+
}
40+
node = node->next;
41+
}
42+
43+
if (p != nullptr) node->next = p;
44+
if (q != nullptr) node->next = q;
45+
46+
return head->next;
47+
}
48+
};

โ€Žsum-of-two-integers/flynn.cpp

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* ํ’€์ด
3+
* - ๋‘ ์ •์ˆ˜๋ฅผ ํ•œ bit์”ฉ ๋”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ•ฉ๋‹ˆ๋‹ค
4+
* - ๋‘ ์ •์ˆ˜์— ๋Œ€ํ•ด ์ด์ง„ ๋ง์…ˆ์„ ์ง„ํ–‰ํ•  ๋•Œ, ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜์˜ bit ๋‘ ๊ฐœ์™€ carry๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ƒˆ๋กœ์šด carry์™€ ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜์˜ ๋ง์…ˆ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค -> adder ํ•จ์ˆ˜ ์ฐธ๊ณ 
5+
* - ๊ฐ ๋น„ํŠธ์— ๋Œ€ํ•ด adder ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ง์…ˆ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค
6+
* - res์˜ ํŠน์ • ์ž๋ฆฌ์— ๋ง์…ˆ ๊ฒฐ๊ณผ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด ๊นŒ๋‹ค๋กœ์› ๋Š”๋ฐ, position์ด๋ผ๋Š” ์ผ์ข…์˜ bitmask๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค
7+
* - ์ €๋Š” Nand2Tetris ๋ผ๋Š” ์ฑ…/๊ฐ•์˜๋ฅผ ๋ณด๋ฉด์„œ ์ด ์ „์— bitwise ์‚ฐ์ˆ  ์—ฐ์‚ฐ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•œ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ๊ฒฝํ—˜์ด ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
8+
* ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค๊ป˜ coursera ๊ฐ•์˜ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค (๋ฌด๋ฃŒ) (https://www.coursera.org/learn/build-a-computer) (2๊ฐ•์— ๋‚˜์˜ด)
9+
*
10+
* Big O
11+
* - N: a์™€ b ์ค‘ ํฐ ์ˆ˜์˜ ๋น„ํŠธ ์ˆ˜ <= 32 (c++ ๊ธฐ์ค€)
12+
*
13+
* - Time complexity: O(N <= 32) = O(1)
14+
* - Space complexity: O(1)
15+
*/
16+
17+
class Solution {
18+
public:
19+
// returns {carry, result}
20+
// carry์™€ result๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์€ bool ์—ฐ์‚ฐ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์€
21+
// x, y, c์— ๋Œ€ํ•˜์—ฌ ๋ฒค ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ทธ๋ ค๋ณด๋ฉด ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
22+
pair<bool, bool> adder(bool x, bool y, bool c) {
23+
return {(x & y) | (x & c) | (y & c), x ^ y ^ c};
24+
}
25+
26+
int getSum(int a, int b) {
27+
bool carry = 0;
28+
unsigned int res = 0;
29+
unsigned int position = 1;
30+
31+
// 32 ๋น„ํŠธ ์ •์ˆ˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ง์…ˆ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค
32+
// 32 ๋น„ํŠธ ๋ชจ๋‘ ๋ง์…ˆ์„ ์ง„ํ–‰ํ–ˆ๊ฑฐ๋‚˜, ๋” ๋”ํ•  ๋น„ํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค
33+
while (position && (a || b || carry)) {
34+
bool lsb_a = a & 1;
35+
a >>= 1;
36+
37+
bool lsb_b = b & 1;
38+
b >>= 1;
39+
40+
auto [new_carry, new_res] = adder(lsb_a, lsb_b, carry);
41+
42+
carry = new_carry;
43+
if (new_res) res |= position;
44+
45+
// position์ด unsigned int (32๋น„ํŠธ)์ด๋ฏ€๋กœ
46+
// bitwise left shift ์—ฐ์‚ฐ์„ 32๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋ฉด 0์ด ๋จ
47+
// 1000 0000 0000 0000 0000 0000 0000 0000 => 0000 0000 0000 0000 0000 0000 0000 0000
48+
// position์ด 0์ด ๋˜๋ฉด 32๋น„ํŠธ ๋ชจ๋‘ ๋ง์…ˆ์„ ์™„๋ฃŒํ–ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ loop๋ฅผ ์ข…๋ฃŒํ•จ
49+
position <<= 1;
50+
}
51+
52+
return (int) res;
53+
}
54+
};

0 commit comments

Comments
ย (0)