Skip to content

Commit a158f59

Browse files
Merge pull request #1818 from grapefruitgreentealoe/week4
[grapefruitgreentealoe] WEEK 04 Solutions
2 parents 2fd52b4 + 298c841 commit a158f59

File tree

5 files changed

+235
-0
lines changed

5 files changed

+235
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
2+
//1. top-down
3+
var coinChange = function(coins, amount) {
4+
if(amount == 0 ) return 0
5+
/*
6+
์ ํ™”์‹ : dp[n] = Math.min(dp[n],dp[n-k]+1)
7+
*/
8+
const dp = new Array(amount+1).fill(Math.pow(10,4));
9+
for(let c of coins){
10+
dp[c] = 1
11+
}
12+
function dfs(idx,coin){
13+
if(idx + coin > amount) return
14+
dp[idx+coin] = Math.min(dp[idx+coin],dp[idx]+1)
15+
if(idx + coin == amount){
16+
return
17+
}else{
18+
for(let c of coins){
19+
dfs(idx+coin,c)
20+
}
21+
}
22+
}
23+
dfs(0,coins[0])
24+
25+
if(dp[amount] > amount) return -1
26+
27+
return dp[amount]
28+
29+
};
30+
31+
// ํƒ€์ž„๋ฆฌ๋ฐ‹์— ๊ฑธ๋ฆฐ๋‹ค. dfs์˜ ๊ฐ€์ง€์น˜๊ธฐ๊ฐ€ ๋œ ๋˜์–ด์„œ ๊ทธ๋ ‡๋‹ค.
32+
// ๊ทธ๋ ‡๋‹ค๋ฉด, ์ˆœ์ฐจ์ ์ธ dp๋ฅผ ์ข€๋” ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„๋ณด์ธ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์ด์ ์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์—†์–ด๋ณด์ธ๋‹ค.
33+
34+
35+
36+
//2. bottom-up
37+
var coinChange = function(coins, amount) {
38+
coins = coins.filter(x=> x<=amount)
39+
if(amount == 0) return 0
40+
/*
41+
์ ํ™”์‹ : dp[n] = Math.min(dp[n],dp[n-k]+1)
42+
*/
43+
const dp = new Array(amount+1).fill(Math.pow(10,4)+1);
44+
dp[0] = 0
45+
//dfs๋ฅผ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, amount๋งŒํผ์˜ for๋ฌธ์„ ๋Œ๋ฉด์„œ dp๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
46+
for(let i=1; i <amount+1; i++){
47+
for(let coin of coins){
48+
if(i-coin >= 0){
49+
dp[i] = Math.min(dp[i-coin] + 1,dp[i])
50+
}
51+
}
52+
}
53+
if(dp[amount] > amount) return -1
54+
return dp[amount]
55+
56+
};
57+
58+
/**
59+
dfs๋ฅผ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, amount๋งŒํผ์˜ for๋ฌธ์„ ๋Œ๋ฉด์„œ dp๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
60+
์ฒ˜์Œ์— coins = coins.filter(x=> x<=amount)
61+
์ด๋ ‡๊ฒŒ ์“ด ์ด์œ ๋Š”, amount๋ณด๋‹ค ์ž‘์€ ์ฝ”์ธ๋งŒ ํ•„ํ„ฐํ•˜์—ฌ ์ตœ์ ํ™”ํ•œ๋‹ค.
62+
63+
์ด ๋ฌธ์ œ ํ’€์ด ์†Œ์š”์‹œ๊ฐ„์ด 1์‹œ๊ฐ„์ด ๋„˜์—ˆ๋Š”๋ฐ,
64+
๊ทธ ์ด์œ ๊ฐ€, i-coin์ด ์•„๋‹ˆ๋ผ, i+coin์„ ๊ธฐ์ค€์„ ์‚ผ์•˜์—ˆ๋‹ค.
65+
๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๊ฐ ๊ธˆ์•ก `i`์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด `dp[i]`๋ฅผ `dp[i-coin]` ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ•ต์‹ฌ์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค.
66+
`dp[i+coin]` ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด, `dp[i]` ์ž์ฒด๊ฐ€ ์•„์ง ์ตœ์ ์˜ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ๋ฐ๋„ ๊ทธ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฏธ๋ž˜์˜ `dp[i+coin]`์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ •ํ™•ํ•œ ์ตœ์ ํ•ด๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ์–ด๋ ค์› ๋‹ค.
67+
ํ˜„์žฌ ๊ธˆ์•ก `i`๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ๊ณผ๊ฑฐ์˜ `dp[i-coin]`์—์„œ ์ฐพ๋Š” '๋ฐ”ํ…€์—…(Bottom-Up)' ๋ฐฉ์‹์ด ์ด ๋ฌธ์ œ์— ํ›จ์”ฌ ์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.
68+
69+
70+
71+
์‹œ๊ฐ„๋ณต์žก๋„: O(n * m)
72+
๊ณต๊ฐ„ ๋ณต์žก๋„ : O(n)
73+
*/
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
ํšŒ์ „ํ•œ ๋ฐ์ดํ„ฐ์—์„œ ์ œ์ผ ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š” ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค.
3+
๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์—, left, right๋ฅผ ๊ฐ๊ฐ 0, nums.length -1 ๋กœ ๋‘์–ด์„œ, left์™€ right๊ฐ€ ๊ฐ™์•„์งˆ๋•Œ ํƒˆ์ถœํ•˜๊ณ , ๊ทธ ๊ฐ™์•„์ง„ index์— ๋Œ€ํ•œ nums[index]๋ฅผ ์ฐพ์•„๋‚ด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
4+
*/
5+
/**
6+
*
7+
* @param {*} nums
8+
* @returns
9+
*/
10+
function findMin(nums) {
11+
let left = 0;
12+
let right = nums.length - 1;
13+
14+
while (left !== right) {
15+
let mid = Math.floor((left + right) / 2);
16+
17+
if (nums[mid] > nums[right]) {
18+
// ์ตœ์†Œ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋‹ค
19+
left = mid + 1;
20+
} else {
21+
// ์ตœ์†Œ๊ฐ’์€ ์™ผ์ชฝ ๊ตฌ๊ฐ„์— ์žˆ๋‹ค (mid๋„ ํฌํ•จ ๊ฐ€๋Šฅ)
22+
right = mid;
23+
}
24+
}
25+
26+
return nums[left]; // ๋˜๋Š” nums[right]๋„ ๊ฐ™์Œ
27+
}
28+
//์‹œ๊ฐ„๋ณต์žก๋„ : ์ด์ง„ํƒ์ƒ‰์„ ์ผ์œผ๋ฏ€๋กœ O(logn)
29+
//๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val, left, right) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.left = (left===undefined ? null : left)
6+
* this.right = (right===undefined ? null : right)
7+
* }
8+
*/
9+
/**
10+
* @param {TreeNode} root
11+
* @return {number}
12+
*/
13+
var maxDepth = function (root) {
14+
if (!root) return 0;
15+
16+
// ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ๊ตฌํ•œ๋‹ค.
17+
const leftDepth = maxDepth(root.left);
18+
const rightDepth = maxDepth(root.right);
19+
20+
// ํ˜„์žฌ ๋…ธ๋“œ์˜ ๊นŠ์ด๋Š” ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๊นŠ์ด ์ค‘ ํฐ ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์ด๋‹ค.
21+
return Math.max(leftDepth, rightDepth) + 1;
22+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//๋‘๊ฐœ์˜ ์ •๋ ฌ๋œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ list1, list2์˜ Head๋ฅผ ๋ฐ›์•˜๋‹ค.(๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ)
2+
/**
3+
* Definition for singly-linked list.
4+
* function ListNode(val, next) {
5+
* this.val = (val===undefined ? 0 : val)
6+
* this.next = (next===undefined ? null : next)
7+
* }
8+
*/
9+
/**
10+
* @param {ListNode} list1
11+
* @param {ListNode} list2
12+
* @return {ListNode}
13+
*/
14+
function mergeTwoLists(
15+
list1,
16+
list2,
17+
) {
18+
if (!(list1 && list2)) return list1 || list2;
19+
if (list1.val < list2.val) {
20+
list1.next = mergeTwoLists(list1.next, list2);
21+
return list1;
22+
} else {
23+
list2.next = mergeTwoLists(list1, list2.next);
24+
return list2;
25+
}
26+
}
27+
28+
/*
29+
list1.val์ด list2.val๋ณด๋‹ค ์ž‘์œผ๋ฉด
30+
list1.next ๋‹ค์Œ์— list2.val์ด ์˜จ๋‹ค.
31+
๋งŒ์•ฝ ์•„๋‹ˆ๋ผ๋ฉด, list2.next ๋‹ค์Œ์— list1์˜ Head๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.
32+
์ด๋ ‡๊ฒŒ next๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด์„œ ์—ฐ๊ฒฐ์ง€์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
33+
34+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(log n)
35+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(h)
36+
*/
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* @param {character[][]} board
3+
* @param {string} word
4+
* @return {boolean}
5+
*/
6+
var exist = function(board, word) {
7+
//word๋ฅผ ์ˆœํšŒํ•ด์„œ board์˜ x,y๋ฅผ ์กฐ์ ˆํ•˜์—ฌ, ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ณ„์† true
8+
const xLength = board[0].length;
9+
const yLength = board.length
10+
11+
// ์ฒดํฌ ๋ฐฐ์—ด: ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ €์žฅ. ๊ฐ DFS๋งˆ๋‹ค ์ƒˆ๋กœ ์ดˆ๊ธฐํ™”๋  ํ•„์š”๋Š” ์—†์Œ (DFS ๋‚ด์—์„œ ๋ฐฑํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ)
12+
const check = Array.from({ length: yLength }, () => Array(xLength).fill(false));
13+
14+
15+
// ๋‹จ์–ด์˜ ์ฒซ ๊ธ€์ž์™€ ์ผ์น˜ํ•˜๋Š” ์‹œ์ž‘์ ์„ ๋ชจ๋‘ ์ˆ˜์ง‘
16+
const startPoints = []
17+
for(let i = 0; i<xLength;i++){
18+
for(let j = 0; j<yLength;j++){
19+
if(board[j][i] == word[0]){
20+
startPoints.push([j,i])
21+
}
22+
}
23+
}
24+
// ๊ฐ ์‹œ์ž‘์ ์—์„œ DFS ์‹œ๋„
25+
for(let startPoint of startPoints){
26+
// ์ž˜๋ชป๋œ ๊ธธ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑํŠธ๋ ‰ํ‚น์€ ๋ฌด์กฐ๊ฑด ํ•„์š”ํ•˜๋‹ค.
27+
if(backTracking(startPoint,board,word,check)) return true
28+
}
29+
30+
return false
31+
};
32+
33+
function backTracking(startPoint,board,word,check){
34+
const xLength = board[0].length;
35+
const yLength = board.length
36+
const upDownLeftRight = [[-1,0],[1,0],[0,-1],[0,1]]
37+
//์Šคํƒ€ํŠธ ํฌ์ธํŠธ๋ถ€ํ„ฐ ํ•ด์„œ, ์™„์„ฑ์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ dfs๋ฅผ ํ†ตํ•ด์„œ ์ง„ํ–‰ํ•œ๋‹ค.
38+
//idx๋Š” ํ˜„์žฌ ํ™•์ธํ•ด์•ผํ•  word์˜ idx์ด๋‹ค.
39+
function dfs(y,x,idx){
40+
if(idx == word.length) return true
41+
42+
if(y < 0 || y >= yLength ||
43+
x < 0 || x >= xLength ||
44+
check[y][x] ||
45+
board[y][x] !== word[idx]
46+
) return false;
47+
48+
check[y][x] = true
49+
// 4๋ฐฉํ–ฅ ํƒ์ƒ‰
50+
for(let [dy,dx] of upDownLeftRight){
51+
//๋งŒ์•ฝ ํƒ€๊ฒŸ์— ํ•ด๋‹นํ•˜๋Š”์ง€๋ฅผ ํ™•์ธ์„ ๋จผ์ € ํ•ด์•ผํ• ๊ฒƒ๊ฐ™์Œ!
52+
if(dfs(y+dy,x+dx,idx+1)) return true //4๋ฐฉํ–ฅ์— ๋Œ€ํ•ด์„œ ๋ชจ๋‘ dfs๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
53+
54+
}
55+
56+
//๋ฐฑํŠธ๋ ˆํ‚น
57+
check[y][x] = false;
58+
return false
59+
60+
}
61+
return dfs(...startPoint,0)
62+
}
63+
64+
/*
65+
์‹œ๊ฐ„ ๋ณต์žก๋„: O(m ร— n ร— 3^{L-1})
66+
- m ร— n: ์‹œ์ž‘์  ํ›„๋ณด ๊ฐœ์ˆ˜
67+
- 3^{L-1}: ์ฒซ ๋ฒˆ์งธ ์ดํ›„๋กœ๋Š” 3๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋ป—์–ด๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
68+
69+
70+
๊ณต๊ฐ„ ๋ณต์žก๋„: O(m ร— n)
71+
- ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด: O(m ร— n)
72+
- ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ: ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋‹จ์–ด ๊ธธ์ด L๊นŒ์ง€ ๊นŠ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ O(L)
73+
74+
์—ฌ๊ธฐ์„œ m, n์€ ๋ณด๋“œ ํฌ๊ธฐ, L์€ ๋‹จ์–ด ๊ธธ์ด
75+
*/

0 commit comments

Comments
ย (0)