Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
08e0556
217 / Contains Duplicate / Easy / 6m
wch2208 Sep 24, 2024
7497658
268 / Missing Number / Easy / 48m
wch2208 Sep 24, 2024
84e4e6b
121 / Best Time to Buy and Sell Stock / Easy / 31m
wch2208 Sep 24, 2024
0d4f11c
252 / Meeting Schedule / Easy / 43m
wch2208 Sep 24, 2024
bdd4e2f
70 / 3Sum / Medium / 29m
wch2208 Sep 24, 2024
b3ed0c0
242 / Valid Anagram / Easy / 17m
wch2208 Oct 1, 2024
51ab1ae
238 / Product of Array Except Self / Medium / 39m
wch2208 Oct 1, 2024
9e03515
191 / Number of 1 Bits / Easy / 10m
wch2208 Oct 1, 2024
68c6bad
100 / Same Tree / Easy / 20m
wch2208 Oct 1, 2024
118ef3d
746 / Min Cost Climbing Stairs / Easy / 40m
wch2208 Oct 1, 2024
c54b414
Merge branch 'master' into wch2208
wch2208 Oct 1, 2024
0de045c
Merge branch 'master' into wch2208
wch2208 Oct 8, 2024
00b1c8f
49 / Group Anagrams / medium / 50m
wch2208 Oct 8, 2024
3ef3f05
190 / Reverse Bits / easy / 49m
wch2208 Oct 8, 2024
f8e6ab1
125 / Valid Palindrome / easy / 41m
wch2208 Oct 8, 2024
d436302
Merge branch 'master' into wch2208
wch2208 Oct 22, 2024
dae0369
338 / counting bits / easy / 41m
wch2208 Oct 22, 2024
f9cd00b
70 / Climbing Stairs / easy / 31m
wch2208 Oct 22, 2024
b792a83
21 / Merge Two Sorted Lists / easy / 46m
wch2208 Oct 22, 2024
7073201
48 / Rotate Image / medium / 48m
wch2208 Oct 22, 2024
9e62c8b
1046 / Last Stone Weight / easy / 39m
wch2208 Oct 22, 2024
4806bea
271 / Encode and Decode Strings / medium / 1hr
wch2208 Oct 29, 2024
d164da7
198 / House Robber / medium / 53m
wch2208 Oct 29, 2024
4e804bb
66 / Plus One / easy / 47m
wch2208 Oct 29, 2024
12e20bd
Merge branch 'master' into wch2208
wch2208 Oct 29, 2024
e367b45
136 / Single Number / easy / 10m 41s
wch2208 Nov 5, 2024
77b37c4
110 / Balanced Binary Tree / easy / 50m
wch2208 Nov 5, 2024
d174987
54 / Spiral Matrix / medium / 1hr
wch2208 Nov 5, 2024
0fbf63e
973 / K Closest Points to Origin / medium / 48m
wch2208 Nov 5, 2024
3eb53dd
Merge branch 'master' into wch2208
wch2208 Nov 5, 2024
af6c97b
128 / Longest Consecutive Sequence / medium / 44m
wch2208 Nov 12, 2024
d3fcbc1
371 / Sum of Two Integers / medium / 32m
wch2208 Nov 12, 2024
93904b5
208 / Implement Trie (Prefix Tree) / medium / 42m
wch2208 Nov 12, 2024
d115dd0
226 / Invert Binary Tree / easy / 29m
wch2208 Nov 12, 2024
013a803
543 / Diameter of Binary Tree / easy
wch2208 Nov 12, 2024
0118a13
Merge branch 'master' into wch2208
wch2208 Nov 12, 2024
c6fa919
102 / Binary Tree Level Order Traversal / medium / 1h 27m
wch2208 Nov 19, 2024
05c4a75
572 / Subtree of Another Tree / easy / 43m
wch2208 Nov 19, 2024
6f82c05
213 / House Robber II / medium / 41m
wch2208 Nov 19, 2024
06b0565
Merge branch 'master' into wch2208
wch2208 Dec 3, 2024
da7f2a8
7 / reverse integer / medium / 18m
wch2208 Dec 3, 2024
9e93cb1
743 / Network Delay Time / medium / 1h 14m
wch2208 Dec 3, 2024
282e74d
39 / Combination Sum / medium / 44m
wch2208 Dec 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions wch2208/102_Binary_Tree_Level_Order_Traversal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrder = function (root) {
// ์ด ๋ฌธ์ œ๋Š” ๊ฐ™์€ ๋ ˆ๋ฒจ์„ ์ˆœํšŒํ•ด์•ผํ•œ๋‹ค.
// BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ์‚ฌ์šฉ

// ๋นˆ ํŠธ๋ฆฌ ์ฒ˜๋ฆฌ
if (!root) return [];

// ์ดˆ๊ธฐํ™” result, queue
const result = [];
const queue = [root]; // TreeNode๋ฅผ ๋ฐฐ์—ด๋กœ ๊ฐ์‹ธ์„œ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ(push, shift)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

while (queue.length > 0) {
const levelSize = queue.length; // ํ˜„์žฌ ๋ ˆ๋ฒจ์—์„œ ์ˆœํšŒํ•  ํšŸ์ˆ˜
const currentLevel = []; // ํ˜„์žฌ ๋ ˆ๋ฒจ์— ๊ฐ’๋“ค์„ ๋‹ด์„ ๋ฐฐ์—ด

for (let i = 0; i < levelSize; i++) {
const node = queue.shift(); // ํ์—์„œ ๊ฐ€์žฅ ์•ž์˜ ๋…ธ๋“œ ์ถ”์ถœ

currentLevel.push(node.val); // ์ถ”์ถœํ•œ ๋…ธ๋“œ์˜ ๊ฐ’์„ ํ˜„์žฌ ๋ ˆ๋ฒจ ๋ฐฐ์—ด์— ์ถ”๊ฐ€

// ๋‹ค์Œ ๋ ˆ๋ฒจ ๋…ธ๋“œ๋“ค์„ ํ์— ์ถ”๊ฐ€
if (node.left) {
queue.push(node.left);
}
if (node.right) {
queue.push(node.right);
}
}

// for๋ฌธ์ด ๋๋‚˜๋ฉด ํ•˜๋‚˜์˜ ๋ ˆ๋ฒจ ํƒ์ƒ‰์ด ๋๋‚œ ๊ฒƒ์ด๋ฏ€๋กœ result์— ์ถ”๊ฐ€
result.push(currentLevel);
}

return result;
};

// time: 1h 27m
// memory: 55.19MB
48 changes: 48 additions & 0 deletions wch2208/213_House_Robber_II.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function (nums) {
// ๋ฌธ์ œ์ดํ•ด
// 1. ์ธ์ ‘ํ•œ ์ง‘์€ ํ„ธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ตœ๋Œ€๋กœ ๋งŽ์€ ๊ธˆ์•ก์„ ํ›”์น˜๋ฉด ์–ผ๋งˆ? (DP ๊ณ„์‚ฐ)
// ์ถ”๊ฐ€ ์กฐ๊ฑด: ์ง‘์ด ์›ํ˜•์œผ๋กœ ๋ฐฐ์น˜๋˜์„œ ์ฒซ ์ง‘๊ณผ ๋งˆ์ง€๋ง‰ ์ง‘์ด ์ธ์ ‘ํ•˜๋‹ค.
// ์ ‘๊ทผ๋ฒ•
// DP๋ฅผ ํ™œ์šฉํ•ด์„œ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. (1๋‹จ๊ณ„)
// ์ถ”๊ฐ€ ์กฐ๊ฑด์„ ๊ณ ๋ คํ•œ ์ถ”๊ฐ€ ๋กœ์ง์„ ์ž‘์„ฑ. (2๋‹จ๊ณ„)
// 2๋‹จ๊ณ„๋Š” 1๋‹จ๊ณ„ ํ•จ์ˆ˜์— nums๋ฅผ ๋ฐ”๊ฟ”์„œ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ๋น„๊ตํ•œ๋‹ค.
// ์™œ๋ƒํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ์ง‘์„ ํ„ด ๊ฒฝ์šฐ๋Š” ๋งˆ์ง€๋ง‰ ์ง‘์„ ์ œ๊ฑฐํ•˜๋ฉด ๋˜๊ณ 
// ์ฒซ๋ฒˆ์งธ ์ง‘์„ ์•ˆ ํ„ด ๊ฒฝ์šฐ๋Š” ์ฒซ๋ฒˆ์งธ ์ง‘์„ ์ œ์™ธํ•˜๊ณ  DP๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.

// ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: ์ง‘์ด 1๊ฐœ์ธ ๊ฒฝ์šฐ
if (nums.length === 1) return nums[0];

// dp๋กœ ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
const simpleRob = houses => {
// ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: ์ง‘์ด 1๊ฐœ์ธ ๊ฒฝ์šฐ
if (houses.length === 1) return houses[0];

// dp ๋ฐฐ์—ด ์ƒ์„ฑ
let dp = new Array(houses.length);

// ๊ธฐ์ € ์กฐ๊ฑด
dp[0] = houses[0];
dp[1] = Math.max(houses[0], houses[1]);

// for๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ์ ํ™”์‹ ์ˆ˜ํ–‰
for (let i = 2; i < houses.length; i++) {
dp[i] = Math.max(houses[i] + dp[i - 2], dp[i - 1]);
}

// ๋งˆ์ง€๋ง‰ ์š”์†Œ์— ์ตœ๋Œ€๊ฐ’์ด ๋‹ด๊น€
return dp[dp.length - 1];
};

// ์ฒซ์ง‘ ํ„ด ๊ฒฝ์šฐ, ์•ˆ ํ„ด ๊ฒฝ์šฐ ์ค‘ ํฐ ๊ฐ’
return Math.max(
simpleRob(nums.slice(0, nums.length - 1)),
simpleRob(nums.slice(1))
);
};

// time: 41m
// memory: 48.78MB
36 changes: 36 additions & 0 deletions wch2208/39_Combination_Sum.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function (candidates, target) {
const result = [];

const findCombinations = (remaining, current, start) => {
// ์ข…๋ฃŒ์กฐ๊ฑด
if (remaining === 0) {
result.push([...current]);
return;
}

if (remaining < 0) return;

// ํ˜„์žฌ ๋‹จ๊ณ„์—์„œ ํ•  ์ผ
for (let i = start; i < candidates.length; i++) {
// 1. ํ˜„์žฌ ์ˆซ์ž๋ฅผ ์„ ํƒ
current.push(candidates[i]);

// 2. ์ด ์ˆซ์ž๋ฅผ ์„ ํƒํ•œ ์ƒํƒœ์—์„œ ์žฌ๊ท€ ํ˜ธ์ถœ
findCombinations(remaining - candidates[i], current, i);

// 3. ๋ฐฑํŠธ๋ž˜ํ‚น: ํ˜„์žฌ ์ˆซ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ ์‹œ๋„
current.pop();
}
};

findCombinations(target, [], 0);

return result;
};

// time: 44m
38 changes: 38 additions & 0 deletions wch2208/572_Subtree_of_Another_Tree.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {TreeNode} subRoot
* @return {boolean}
*/
var isSubtree = function (root, subRoot) {
if (!root) return false;
if (!subRoot) return true; // ์„œ๋ธŒ ๋ฃจํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋น„๊ตํ•  ํ•„์š” ์—†์ด true

// ํ˜„์žฌ ๋…ธ๋“œ ๋น„๊ต
if (isSameTree(root, subRoot)) return true;

// ์žฌ๊ท€ํ˜ธ์ถœ: ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ํ™•์ธ
// ๋‘˜ ์ค‘ ํ•œ ๊ณณ์—์„œ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์ผ์น˜ํ•˜๋Š” ํŠธ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด true
return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
};

function isSameTree(p, q) {
if (!p && !q) return true; // ๋‘˜ ๋‹ค null์ด๋ฉด true
if (!p || !q) return false; // ํ•˜๋‚˜๋งŒ null์ด๋ฉด false

// ํ˜„์žฌ ๋…ธ๋“œ ๋น„๊ต
if (p.val !== q.val) return false;

// ์žฌ๊ท€ ํ˜ธ์ถœ: ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ํŠธ๋ฆฌ ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•จ
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}

// time: 43m
// memory: 54.73MB
76 changes: 76 additions & 0 deletions wch2208/743_Network_Delay_Time.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/**
* @param {number[][]} times
* @param {number} n
* @param {number} k
* @return {number}
*/
var networkDelayTime = function (times, n, k) {
// ๋ฌธ์ œ์ดํ•ด: ์ˆซ์ž ๋ฆฌ์ŠคํŠธ์™€ n, k๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. k๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ชจ๋“  ๋…ธ๋“œ์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•œ๋‹ค ๋ชจ๋“  ๋…ธ๋“œ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1
// times[i] = (ui, vi, wi) ์ด ํ˜•ํƒœ๋ฅผ ๋ณด๊ณ  ๊ทธ๋ž˜ํ”„ ์ž๋ฃŒ๊ตฌ์กฐ์ž„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ์‹œ์ž‘์  ํ•˜๋‚˜ + ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ/์‹œ๊ฐ„ + ์–‘์˜ ๊ฐ€์ค‘์น˜, ์ด ์กฐ๊ฑด์œผ๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// 1. ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
const graph = new Map();

for (let i = 1; i <= n; i++) {
graph.set(i, []);
}
// console.log(graph)
// Map(4) { 1 => [], 2 => [], 3 => [], 4 => [] }

for (const [u, v, w] of times) {
graph.get(u).push([v, w]);
}
// console.log(graph)
// Map(3) { 1 => [], 2 => [ [ 1, 1 ], [ 3, 1 ] ], 3 => [ [ 4, 1 ] ] }

// 2. ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
const distances = new Array(n + 1).fill(Infinity);
distances[k] = 0;

// console.log(distances)
// [ Infinity, Infinity, 0, Infinity, Infinity ]

// 3. ๋ฐฉ๋ฌธ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”
const visited = new Array(n + 1).fill(false);
// console.log(visited)
// [ false, false, false, false, false ]

// 4. ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„
for (let i = 1; i <= n; i++) {
// 4-1. ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ธ ๋…ธ๋“œ ์ฐพ๊ธฐ
let minDist = Infinity;
let minNode = -1;
for (let node = 1; node <= n; node++) {
if (!visited[node] && distances[node] < minDist) {
minDist = distances[node];
minNode = node;
}
}

// 4-2. ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
if (minNode === -1) break;

// 4-3. ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
visited[minNode] = true;

// 4-4. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์˜ ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
for (const [nextNode, time] of graph.get(minNode)) {
const newDist = distances[minNode] + time;
if (newDist < distances[nextNode]) {
distances[nextNode] = newDist;
}
}
}

// 5. ๊ฒฐ๊ณผ ๊ณ„์‚ฐ
let maxDist = 0;
for (let i = 1; i <= n; i++) {
if (distances[i] === Infinity) return -1;
maxDist = Math.max(maxDist, distances[i]);
}

return maxDist;
};

// time: 1h 14m
18 changes: 18 additions & 0 deletions wch2208/7_Reverse_Integer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
const isNegative = x < 0;

const reversed = Math.abs(x).toString().split("").reverse().join("");

const result = Number(reversed);

// 32๋น„ํŠธ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š”์ง€ ํ™•์ธ ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ๋” ์ž‘๊ฑฐ๋‚˜ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ๋” ํฐ ๊ฒฝ์šฐ
if (result < Math.pow(-2, 31) || result > Math.pow(2, 31) - 1) return 0;

return isNegative ? -result : result;
};

// time: 18m 43s
Loading