Skip to content

Commit ec29075

Browse files
authored
Merge pull request #1352 from clara-shin/main
[clara-shin] Week 4 Solutions
2 parents c2ae73d + e3570f2 commit ec29075

File tree

4 files changed

+138
-0
lines changed

4 files changed

+138
-0
lines changed

โ€Žcoin-change/clara-shin.jsโ€Ž

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(amount * coins.length)
3+
* ๊ฐ ๊ธˆ์•ก์— ๋Œ€ํ•ด ๋ชจ๋“  ๋™์ „์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ
4+
*/
5+
6+
/**
7+
* @param {number[]} coins
8+
* @param {number} amount
9+
* @return {number}
10+
*/
11+
var coinChange = function (coins, amount) {
12+
const dp = new Array(amount + 1).fill(Infinity);
13+
14+
dp[0] = 0; // ๊ธˆ์•ก 0์€ ๋™์ „์ด ํ•„์š” ์—†์Œ
15+
16+
for (const coin of coins) {
17+
for (let i = coin; i <= amount; i++) {
18+
// dp[i] : ๊ธˆ์•ก i๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜
19+
// dp[i - coin] + 1 : ํ˜„์žฌ ๋™์ „์„ ํ•œ ๊ฐœ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๊ธˆ์•ก(i - coin)์„ ๋งŒ๋“œ๋Š” ์ตœ์†Œ ๋™์ „ ๊ฐœ์ˆ˜
20+
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
21+
}
22+
}
23+
24+
return dp[amount] === Infinity ? -1 : dp[amount];
25+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด 1~n๋ฒˆ ํšŒ์ „๋œ ์ƒํƒœ์—์„œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ
3+
* ๋ฌธ์ œ ํ•ต์‹ฌ:
4+
* 1. ๋ฐฐ์—ด์€ ์›๋ž˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์—ˆ์Œ
5+
* 2. ๊ทธ ๋ฐฐ์—ด์ด 1~n๋ฒˆ ํšŒ์ „๋˜์—ˆ์Œ
6+
* 3. ์ตœ์†Œ๊ฐ’์„ O(log n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ฐพ์•„์•ผ ํ•จ
7+
*
8+
* => ์ด ๋ฌธ์ œ๋Š” ํšŒ์ „๋œ ๋ฐฐ์—ด์—์„œ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•จ
9+
* => ์ตœ์†Œ๊ฐ’์€ pivot ํฌ์ธํŠธ(ํšŒ์ „์ด ์ผ์–ด๋‚œ ์ง€์ )์—์„œ ๋ฐœ๊ฒฌ๋จ
10+
*/
11+
12+
/**
13+
* @param {number[]} nums - ํšŒ์ „๋œ ์ •๋ ฌ ๋ฐฐ์—ด
14+
* @return {number} - ๋ฐฐ์—ด์˜ ์ตœ์†Œ๊ฐ’
15+
*/
16+
var findMin = function (nums) {
17+
let left = 0; // ๊ฒ€์ƒ‰๋ฒ”์œ„์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค
18+
let right = nums.length - 1; // ๊ฒ€์ƒ‰๋ฒ”์œ„์˜ ๋ ์ธ๋ฑ์Šค
19+
20+
// ์ด์ง„ ํƒ์ƒ‰
21+
while (left < right) {
22+
const mid = Math.floor((left + right) / 2);
23+
24+
// ์ค‘๊ฐ„ ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ ๋ ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด, ์ตœ์†Œ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์— ์žˆ์Œ
25+
if (nums[mid] > nums[right]) {
26+
left = mid + 1;
27+
}
28+
// ์ค‘๊ฐ„ ๊ฐ’์ด ์˜ค๋ฅธ์ชฝ ๋ ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด, ์ตœ์†Œ๊ฐ’์€ ์™ผ์ชฝ์— ์žˆ์Œ (์ค‘๊ฐ„ ํฌํ•จ)
29+
else {
30+
right = mid;
31+
}
32+
}
33+
34+
// ๋ฐ˜๋ณต์ด ๋๋‚˜๋ฉด left์™€ right๋Š” ๊ฐ™์€ ์ธ๋ฑ์Šค์„ ๊ฐ€๋ฆฌํ‚ค๊ณ , ์ด ์ธ๋ฑ์Šค์˜ ๊ฐ’(ํ”ผ๋ด‡ํฌ์ธํŠธ) = ์ตœ์†Œ๊ฐ’์˜ ์œ„์น˜
35+
return nums[left];
36+
};
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* ๋ฌธ์ œ ์š”์•ฝ: ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ์ด ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค
3+
* ์ตœ๋Œ€ ๊นŠ์ด: ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๋จผ ๋ฆฌํ”„ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ์ˆ˜
4+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) - ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธ
5+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(h) - h๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด(์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)) - ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ ์‚ฌ์šฉ
6+
*/
7+
8+
/**
9+
* Definition for a binary tree node.
10+
* function TreeNode(val, left, right) {
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+
* @param {TreeNode} root
18+
* @return {number}
19+
*/
20+
var maxDepth = function (root) {
21+
// ๊ธฐ์ € ์กฐ๊ฑด: ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด(empty tree) ๊นŠ์ด๋Š” 0
22+
if (root === null) {
23+
return 0;
24+
}
25+
26+
const leftDepth = maxDepth(root.left);
27+
const rightDepth = maxDepth(root.right);
28+
29+
// ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ตœ๋Œ€ ๊นŠ์ด: ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๊นŠ์ด ์ค‘ ํฐ ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’
30+
return Math.max(leftDepth, rightDepth) + 1;
31+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* ๋ฌธ์ œ ์ •์˜
3+
* ์ž…๋ ฅ: ๋‘ ๊ฐœ์˜ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ ๋…ธ๋“œ list1๊ณผ list2
4+
* ์ถœ๋ ฅ: ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉํ•œ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ ๋…ธ๋“œ
5+
* ์กฐ๊ฑด: ๋‘ ๋ฆฌ์ŠคํŠธ๋Š” ์ด๋ฏธ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์Œ
6+
*
7+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ•
8+
* 1. ๋”๋ฏธ ํ—ค๋“œ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ ์„ ์„ค์ •
9+
* 2. ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
10+
* 3. ํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ์˜ ๋‚จ์€ ๋…ธ๋“œ๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์—ฐ๊ฒฐ
11+
* 4. ๋”๋ฏธ ํ—ค๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜
12+
* 5. ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n + m) (n: list1์˜ ๊ธธ์ด, m: list2์˜ ๊ธธ์ด)
13+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1) (์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„ ์‚ฌ์šฉ ์—†์Œ)
14+
*
15+
* ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ์žฌ๊ท€ํ˜ธ์ถœ ์Šคํƒ ๋•Œ๋ฌธ์— O(n + m)์ด ๋จ
16+
* ๋”ฐ๋ผ์„œ, ๋ฐ˜๋ณต์ (iterative) ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ O(1)๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
17+
*/
18+
19+
/**
20+
* @param {ListNode} list1 - ์ฒซ ๋ฒˆ์งธ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ
21+
* @param {ListNode} list2 - ๋‘ ๋ฒˆ์งธ ์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ
22+
* @return {ListNode} - ๋ณ‘ํ•ฉ๋œ ์ •๋ ฌ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ
23+
*/
24+
var mergeTwoLists = function (list1, list2) {
25+
let dummy = new ListNode(-1); // ๋”๋ฏธ ํ—ค๋“œ ๋…ธ๋“œ ์ƒ์„ฑ (๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘์ )
26+
27+
let current = dummy; // ํ˜„์žฌ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๋Š” ํฌ์ธํ„ฐ
28+
29+
while (list1 !== null && list2 !== null) {
30+
if (list1.val <= list2.val) {
31+
current.next = list1;
32+
list1 = list1.next;
33+
} else {
34+
current.next = list2;
35+
list2 = list2.next;
36+
}
37+
// ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์˜ ํฌ์ธํ„ฐ ์ด๋™ใ„ฑใ„ฑ
38+
current = current.next;
39+
}
40+
41+
// ๋‚จ์•„์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์—ฐ๊ฒฐ (list1์ด๋‚˜ list2 ์ค‘ ํ•˜๋‚˜๋Š” ์ด๋ฏธ null์ผ ํ…Œ๋‹ˆ๊นŒ)
42+
current.next = list1 !== null ? list1 : list2;
43+
44+
// ๋”๋ฏธ ํ—ค๋“œ ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ์‹ค์ œ ๊ฒฐ๊ณผ์˜ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ ๋จ
45+
return dummy.next;
46+
};

0 commit comments

Comments
ย (0)