Skip to content

Commit c6c68ab

Browse files
authored
Merge pull request #1390 from JANGSEYEONG/main
[JANGSEYEONG] WEEK 05 solutions
2 parents 4bbd6b7 + f9c3bdf commit c6c68ab

File tree

5 files changed

+246
-0
lines changed

5 files changed

+246
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) - ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•จ
3+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1) - ์ถ”๊ฐ€ ๋ฐฐ์—ด ์—†์ด ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ž…๋ ฅ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•œ ์ƒ์ˆ˜ ๊ณต๊ฐ„
4+
*/
5+
/**
6+
* @param {number[]} prices
7+
* @return {number}
8+
*/
9+
var maxProfit = function (prices) {
10+
let minPrice = prices[0]; // ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ€๊ฒฉ
11+
let maxProfit = 0; // ์ตœ๋Œ€ ์ด์ต
12+
for (let i = 1; i < prices.length; i++) {
13+
if (prices[i] > minPrice) {
14+
// ํ˜„์žฌ ๊ฐ€๊ฒฉ์ด minPrice๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์— ์ด์ต ๊ฐฑ์‹ 
15+
maxProfit = Math.max(maxProfit, prices[i] - minPrice);
16+
} else {
17+
// ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ตœ์†Œ ๊ฐ€๊ฒฉ ๊ฐฑ์‹ 
18+
minPrice = prices[i];
19+
}
20+
}
21+
return maxProfit;
22+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) - n์€ ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ์ด ๊ธธ์ด. ๊ฐ ๋ฌธ์ž๋ฅผ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์ฒ˜๋ฆฌํ•จ
3+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n) - ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์›๋ณธ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋งŒํผ ๊ณต๊ฐ„ ํ•„์š”
4+
*/
5+
var encode = function (strs) {
6+
let text = "";
7+
for (let str of strs) {
8+
// ๊ฐ ๋ฌธ์ž์—ด ์•ž์— ๊ธธ์ด์™€ ๊ตฌ๋ถ„์ž(:)๋ฅผ ๋ถ™์—ฌ์„œ ์ €์žฅ
9+
// ์˜ˆ: ["abc", "de"] -> "3:abc2:de"
10+
text += `${str.length}:${str}`;
11+
}
12+
return text;
13+
};
14+
15+
var decode = function (s) {
16+
const result = [];
17+
let start = 0;
18+
19+
while (start < s.length) {
20+
// ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ์— ๋“ฑ์žฅํ•˜๋Š” ์ฝœ๋ก  ์œ„์น˜๋ฅผ ์ฐพ์•„ ๊ธธ์ด ์ •๋ณด ์ถ”์ถœ
21+
const mid = s.indexOf(":", start);
22+
const length = parseInt(s.substring(start, mid));
23+
24+
// ๊ธธ์ด ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์›๋ž˜ ๋ฌธ์ž์—ด ์ถ”์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ์ถ”๊ฐ€
25+
result.push(s.substring(mid + 1, mid + 1 + length));
26+
27+
// ๋‹ค์Œ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์œ„์น˜๋กœ ์ด๋™
28+
start = mid + 1 + length;
29+
}
30+
31+
return result;
32+
};

โ€Žgroup-anagrams/JANGSEYEONG.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* ์ฒซ๋ฒˆ์จฐ ํ’€์ด: ๊ฐ ๋‹จ์–ด๋งˆ๋‹ค ์ด์ „์— ์ฒ˜๋ฆฌํ•œ ๋‹จ์–ด๋“ค๊ณผ ์ผ์ผ์ด ๋น„๊ตํ•˜์—ฌ ์• ๋„ˆ๊ทธ๋žจ ์—ฌ๋ถ€ ํ™•์ธ
3+
* ์ฒซ๋ฒˆ์งธ ํ’€์ด๋กœ๋„ ํ†ต๊ณผ๋Š” ํ•จ
4+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(nยฒ*k), ๊ณต๊ฐ„๋ณต์žก๋„: O(n*k) (n: ๋‹จ์–ด ์ˆ˜, k: ํ‰๊ท  ๋‹จ์–ด ๊ธธ์ด)
5+
*/
6+
/*var groupAnagrams = function (strs) {
7+
if (strs.length === 1) return [strs];
8+
9+
const answer = [[strs[0]]];
10+
11+
for (let i = 1; i < strs.length; i++) {
12+
let flag = false;
13+
for (let k = 0; k < answer.length; k++) {
14+
const word = answer[k][0];
15+
if (isAnagram(word, strs[i])) {
16+
answer[k].push(strs[i]);
17+
flag = true;
18+
}
19+
}
20+
if (!flag) answer.push([strs[i]]);
21+
}
22+
23+
return answer;
24+
};
25+
26+
var isAnagram = function (s1, s2) {
27+
if (s1.length !== s2.length) return false;
28+
29+
// ์˜์–ด ์†Œ๋ฌธ์ž ๊ฐœ์ˆ˜ ์ด 26๊ฐœ
30+
const code = new Array(26).fill(0);
31+
32+
for (let i = 0; i < s1.length; i++) {
33+
code[s1[i].charCodeAt() - 97]++;
34+
code[s2[i].charCodeAt() - 97]--;
35+
}
36+
return code.every((x) => x === 0);
37+
};
38+
*/
39+
///////////////////////////////////////////////////////////////
40+
41+
/*
42+
* ๋‘๋ฒˆ์จฐ ํ’€์ด: ์ •๋ ฌ๋œ ๋ฌธ์ž์—ด์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์‹œ๋งต์— ๊ทธ๋ฃนํ™”
43+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(n*k*log(k)), ๊ณต๊ฐ„๋ณต์žก๋„: O(n*k) (n: ๋‹จ์–ด ์ˆ˜, k: ํ‰๊ท  ๋‹จ์–ด ๊ธธ์ด)
44+
*/
45+
/**
46+
* @param {string[]} strs
47+
* @return {string[][]}
48+
*/
49+
var groupAnagrams = function (strs) {
50+
if (strs.length === 1) return [strs];
51+
52+
// ํ•ด์‹œ๋งต์œผ๋กœ ์• ๋„ˆ๊ทธ๋žจ ๊ทธ๋ฃน ๊ด€๋ฆฌ
53+
const answer = {};
54+
55+
for (let i = 0; i < strs.length; i++) {
56+
// ์• ๋„ˆ๊ทธ๋žจ์€ ์ •๋ ฌํ•˜๋ฉด ๋™์ผํ•œ ๋ฌธ์ž์—ด์ด ๋จ
57+
// k๋Š” ์ตœ๋Œ€ 100์œผ๋กœ ์ œํ•œ๋˜์–ด ์žˆ์–ด ์ •๋ ฌ(O(k log k))์ด ํšจ์œจ์ ์ด๋ฏ€๋กœ
58+
// ์ฒซ ๋ฒˆ์งธ ํ’€์ด์˜ ์นด์šดํŒ… ๋ฐฉ์‹ ๋Œ€์‹  ๊ฐ„๋‹จํžˆ ์ •๋ ฌ๋กœ ํŒ๋ณ„ ๊ฐ€๋Šฅ
59+
const sort = [...strs[i]].sort().join("");
60+
61+
// ์ด๋ฏธ ๊ฐ™์€ ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ทธ๋ฃน์— ์ถ”๊ฐ€
62+
if (sort in answer) {
63+
answer[sort].push(strs[i]);
64+
} else {
65+
// ์ƒˆ๋กœ์šด ๊ทธ๋ฃน ์ƒ์„ฑ
66+
answer[sort] = [strs[i]];
67+
}
68+
}
69+
70+
return Object.values(answer);
71+
};
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/**
2+
* Trie(ํŠธ๋ผ์ด) ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๊ตฌํ˜„
3+
*
4+
* ์›๋ฆฌ: ํŠธ๋ผ์ด๋Š” ๋ฌธ์ž์—ด์„ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ
5+
* ๊ฐ ๋…ธ๋“œ๋Š” ํ•œ ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฃจํŠธ์—์„œ ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์ด ๋œ๋‹ค
6+
* ๊ณตํ†ต ์ ‘๋‘์‚ฌ๋ฅผ ๊ณต์œ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ณ , ์ ‘๋‘์‚ฌ ๊ฒ€์ƒ‰์„ O(k) ์‹œ๊ฐ„์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
7+
*/
8+
var Trie = function () {
9+
this.root = {}; // ๋ฃจํŠธ ๋…ธ๋“œ
10+
};
11+
12+
/**
13+
* @param {string} word
14+
* @return {void}
15+
*/
16+
Trie.prototype.insert = function (word) {
17+
let node = this.root;
18+
19+
for (let char of word) {
20+
if (!node[char]) {
21+
// ์ฒ˜์Œ ๋“ค์–ด์˜ค๋Š” ๋‹จ์–ด์ผ ๊ฒฝ์šฐ, ์ƒˆ ํŠธ๋ฆฌ๊ตฌ์กฐ ์ƒ์„ฑ
22+
node[char] = {};
23+
}
24+
// ํ˜„์žฌ ๋‹จ์–ด ์œ„์น˜๋กœ ์ด๋™
25+
node = node[char];
26+
}
27+
node.isEnd = true; // ๋‹จ์–ด ๋ ํ‘œ์‹œ
28+
};
29+
30+
/**
31+
* @param {string} word
32+
* @return {boolean}
33+
*/
34+
Trie.prototype.search = function (word) {
35+
let node = this.traverse(word);
36+
return node !== null && node.isEnd === true;
37+
};
38+
39+
/**
40+
* @param {string} prefix
41+
* @return {boolean}
42+
*/
43+
Trie.prototype.startsWith = function (prefix) {
44+
return this.traverse(prefix) !== null;
45+
};
46+
47+
/**
48+
* ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ๋”ฐ๋ผ ํŠธ๋ผ์ด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜
49+
* @param {string} str - ํŠธ๋ผ์ด์—์„œ ํƒ์ƒ‰ํ•  ๋ฌธ์ž์—ด
50+
* @return {object|null} - ๋ฌธ์ž์—ด ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด null
51+
*/
52+
Trie.prototype.traverse = function (str) {
53+
let node = this.root;
54+
55+
// ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœํšŒ
56+
for (let char of str) {
57+
// ํ˜„์žฌ ๋ฌธ์ž์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด ํƒ์ƒ‰ ์‹คํŒจ
58+
if (!node[char]) {
59+
return null;
60+
}
61+
// ํ•ด๋‹น ๋ฌธ์ž์˜ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์—ฌ ํƒ์ƒ‰ ๊ณ„์†
62+
node = node[char];
63+
}
64+
return node;
65+
};
66+
67+
/**
68+
* Your Trie object will be instantiated and called as such:
69+
* var obj = new Trie()
70+
* obj.insert(word)
71+
* var param_2 = obj.search(word)
72+
* var param_3 = obj.startsWith(prefix)
73+
*/

โ€Žword-break/JANGSEYEONG.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* ๋ฌธ์ž์—ด์ด ๋‹จ์–ด ์‚ฌ์ „ ๋‚ด์˜ ๋‹จ์–ด๋“ค๋กœ ๋ถ„ํ•  ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
3+
*
4+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(n * m * k)
5+
* - n: ๋ฌธ์ž์—ด ๊ธธ์ด
6+
* - m: ๋‹จ์–ด ์‚ฌ์ „ ํฌ๊ธฐ
7+
* - k: ๋‹จ์–ด ์‚ฌ์ „ ๋‚ด ๊ฐ€์žฅ ๊ธด ๋‹จ์–ด์˜ ๊ธธ์ด
8+
*
9+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
10+
* - n: ๋ฌธ์ž์—ด ๊ธธ์ด (๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ €์žฅ ๊ณต๊ฐ„)
11+
*
12+
* @param {string} s - ๋ถ„ํ• ํ•˜๋ ค๋Š” ๋ฌธ์ž์—ด
13+
* @param {string[]} wordDict - ๋‹จ์–ด ์‚ฌ์ „
14+
* @return {boolean} - ๋ฌธ์ž์—ด์„ ๋‹จ์–ด ์‚ฌ์ „ ๋‚ด ๋‹จ์–ด๋“ค๋กœ ๋ถ„ํ•  ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€
15+
*/
16+
var wordBreak = function (s, wordDict) {
17+
// ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์œ„ํ•œ ๊ฐ์ฒด
18+
const memo = {};
19+
20+
const dfs = function (start) {
21+
// ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์œ„์น˜๋ผ๋ฉด ์ €์žฅ๋œ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
22+
if (start in memo) return memo[start];
23+
24+
// ๋ฌธ์ž์—ด ๋๊นŒ์ง€ ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด ์„ฑ๊ณต
25+
if (start === s.length) {
26+
memo[start] = true;
27+
return true;
28+
}
29+
30+
// ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ์‹œ๋„
31+
for (const word of wordDict) {
32+
// ํ˜„์žฌ ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ๋‹จ์–ด์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
33+
if (s.substring(start, start + word.length) === word) {
34+
// ๋‚จ์€ ๋ฌธ์ž์—ด๋„ ๋ถ„ํ•  ๊ฐ€๋Šฅํ•œ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ™•์ธ
35+
if (dfs(start + word.length)) {
36+
memo[start] = true;
37+
return true;
38+
}
39+
}
40+
}
41+
42+
// ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€๋Šฅํ•œ ๋ถ„ํ• ์ด ์—†์Œ
43+
memo[start] = false;
44+
return false;
45+
};
46+
47+
return dfs(0);
48+
};

0 commit comments

Comments
ย (0)