Skip to content

Commit 832329a

Browse files
authored
Merge pull request #1529 from krokerdile/main
[krokerdile] Week 9 Solutions
2 parents 7356c37 + 8705c4e commit 832329a

File tree

5 files changed

+166
-0
lines changed

5 files changed

+166
-0
lines changed

โ€Žclone-graph/krokerdile.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @param {_Node} node
3+
* @return {_Node}
4+
*/
5+
var cloneGraph = function(node) {
6+
if (!node) return null;
7+
8+
const visited = new Map(); // ์›๋ณธ ๋…ธ๋“œ -> ๋ณต์ œ ๋…ธ๋“œ
9+
10+
function dfs(curr) {
11+
if (visited.has(curr)) {
12+
return visited.get(curr); // ์ด๋ฏธ ๋ณต์ œํ•œ ๊ฒฝ์šฐ
13+
}
14+
15+
const copy = new _Node(curr.val);
16+
visited.set(curr, copy); // ๋ณต์ œํ•œ ๋…ธ๋“œ ์ €์žฅ
17+
18+
for (const neighbor of curr.neighbors) {
19+
copy.neighbors.push(dfs(neighbor)); // ์ด์›ƒ๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌ
20+
}
21+
22+
return copy;
23+
}
24+
25+
return dfs(node);
26+
};
27+

โ€Žlinked-list-cycle/krokerdile.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val) {
4+
* this.val = val;
5+
* this.next = null;
6+
* }
7+
*/
8+
9+
/**
10+
* @param {ListNode} head
11+
* @return {boolean}
12+
*/
13+
var hasCycle = function(head) {
14+
let list = new Set();
15+
while (head != null) {
16+
if (list.has(head))
17+
return true;
18+
list.add(head);
19+
head = head.next;
20+
}
21+
22+
return false;
23+
};
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* @param {string} text1
3+
* @param {string} text2
4+
* @return {number}
5+
*
6+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(m * n)
7+
* - m = text1.length, n = text2.length
8+
* - 2์ค‘ for๋ฌธ์œผ๋กœ dp ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ
9+
*
10+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(m * n)
11+
* - dp ๋ฐฐ์—ด์— m * n ๋งŒํผ์˜ ๊ณต๊ฐ„ ์‚ฌ์šฉ
12+
* - ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ๋ฐฐ์—ด 2๊ฐœ๋กœ๋„ ๊ฐ€๋Šฅ
13+
*/
14+
var longestCommonSubsequence = function(text1, text2) {
15+
let m = text1.length;
16+
let n = text2.length;
17+
18+
// 2์ฐจ์› dp ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” (m+1) x (n+1)
19+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
20+
21+
// dp[i][j] = text1[0..i-1], text2[0..j-1] ๊นŒ์ง€์˜ LCS ๊ธธ์ด
22+
for (let i = 1; i <= m; i++) {
23+
for (let j = 1; j <= n; j++) {
24+
if (text1[i - 1] === text2[j - 1]) {
25+
// ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด, ์ด์ „๊นŒ์ง€์˜ LCS + 1
26+
dp[i][j] = dp[i - 1][j - 1] + 1;
27+
} else {
28+
// ์•„๋‹ˆ๋ฉด, ์ด์ „ ํ–‰/์—ด ์ค‘ ๋” ํฐ ๊ฐ’ ์„ ํƒ
29+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
30+
}
31+
}
32+
}
33+
34+
return dp[m][n]; // ๋งˆ์ง€๋ง‰ cell์ด ์ •๋‹ต
35+
};
36+
37+
//์‹คํŒจํ•œ dfs ์ฝ”๋“œ
38+
/**
39+
* @param {string} text1
40+
* @param {string} text2
41+
* @return {number}
42+
*/
43+
var longestCommonSubsequence = function(text1, text2) {
44+
function dfs(i, j) {
45+
// ์ข…๋ฃŒ ์กฐ๊ฑด: ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด 0
46+
if (i === text1.length || j === text2.length) {
47+
return 0;
48+
}
49+
50+
// ๋ฌธ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด, ๋‹ค์Œ ๋ฌธ์ž๋กœ ์ด๋™ํ•˜๋ฉฐ ๊ธธ์ด +1
51+
if (text1[i] === text2[j]) {
52+
return 1 + dfs(i + 1, j + 1);
53+
}
54+
55+
// ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋ฉด, ๋‘ ๊ฐ€์ง€ ๊ฐˆ๋ž˜ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ์„ ํƒ
56+
return Math.max(
57+
dfs(i + 1, j), // text1์˜ ๋‹ค์Œ ๋ฌธ์ž๋กœ
58+
dfs(i, j + 1) // text2์˜ ๋‹ค์Œ ๋ฌธ์ž๋กœ
59+
);
60+
}
61+
62+
return dfs(0, 0);
63+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
*
5+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(n^2)
6+
* - ๊ฐ ๋ฌธ์ž(i)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ™•์žฅ โ†’ ์ตœ๋Œ€ n๋ฒˆ
7+
* - ๊ฐ ์ค‘์‹ฌ์—์„œ ์–‘์ชฝ์œผ๋กœ ํ™•์žฅํ•˜๋ฉด์„œ ๋น„๊ต โ†’ ์ตœ๋Œ€ n๋ฒˆ
8+
* โ†’ O(n) * O(n) = O(n^2)
9+
*
10+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
11+
* - ์ถ”๊ฐ€ ๊ณต๊ฐ„ ์—†์ด count ๋ณ€์ˆ˜์™€ index๋งŒ ์‚ฌ์šฉ
12+
* - ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•˜์ง€ ์•Š์Œ
13+
*/
14+
var countSubstrings = function(s) {
15+
let count = 0;
16+
17+
// ์ „์ฒด ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์œ„์น˜๋ฅผ ํŒฐ๋ฆฐ๋“œ๋กฌ ์ค‘์‹ฌ์œผ๋กœ ์žก์Œ
18+
for (let i = 0; i < s.length; i++) {
19+
// ํ™€์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ: ex. "aba"
20+
helper(i, i);
21+
22+
// ์ง์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ: ex. "abba"
23+
helper(i, i + 1);
24+
}
25+
26+
// ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์œ ์ง€๋˜๋Š” ๋™์•ˆ count ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํ•จ์ˆ˜
27+
function helper(left, right) {
28+
// ์กฐ๊ฑด์ด ๋งž์„ ๋•Œ๋งˆ๋‹ค ์ขŒ์šฐ๋กœ ํ™•์žฅ
29+
while (left >= 0 && right < s.length && s[left] === s[right]) {
30+
count++; // ์œ ํšจํ•œ ํŒฐ๋ฆฐ๋“œ๋กฌ ํ•˜๋‚˜ ๋ฐœ๊ฒฌ
31+
left--;
32+
right++;
33+
}
34+
}
35+
36+
return count;
37+
};

โ€Žsum-of-two-integers/krokerdile.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* @param {number} a
3+
* @param {number} b
4+
* @return {number}
5+
*/
6+
function getSum(a, b) {
7+
while (b !== 0) {
8+
const sum = a ^ b; // ์ž๋ฆฌ์˜ฌ๋ฆผ ์—†๋Š” ํ•ฉ
9+
const carry = (a & b) << 1; // ์ž๋ฆฌ์˜ฌ๋ฆผ ๋น„ํŠธ
10+
11+
a = sum;
12+
b = carry;
13+
}
14+
15+
return a;
16+
}

0 commit comments

Comments
ย (0)