Skip to content

Commit d378148

Browse files
authored
Merge pull request #873 from mmyeon/main
[mallayon] Week 5
2 parents 126524b + 78b0c1c commit d378148

File tree

5 files changed

+230
-0
lines changed

5 files changed

+230
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
*
3+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
4+
* - max profit์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ O(n)์œผ๋กœ ํ’€๊ธฐ
5+
* - ํ˜„์žฌ ๊ฐ€๊ฒฉ์—์„œ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ€๊ฒฉ์„ ๋บ€ ๊ฐ’์„ max profit์œผ๋กœ ์„ค์ •
6+
*
7+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
8+
* - n์€ prices ๊ธธ์ด, ์š”์†Œ 1ํšŒ ์ˆœํšŒํ•˜๋‹ˆ๊นŒ O(n)
9+
*
10+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
11+
* - ๋ณ€์ˆ˜ 2๊ฐœ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ O(1)
12+
*/
13+
14+
function maxProfit(prices: number[]): number {
15+
let minPrice = prices[0],
16+
maxProfit = 0;
17+
18+
for (const price of prices) {
19+
minPrice = Math.min(price, minPrice);
20+
maxProfit = Math.max(maxProfit, price - minPrice);
21+
}
22+
23+
return maxProfit;
24+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
3+
* - ๋ฐฐ์—ด 1ํšŒ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ
4+
*
5+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
6+
*/
7+
function encode(strs: string[]): string {
8+
let result = strs[0];
9+
10+
for (let i = 1; i < strs.length; i++) {
11+
result += "#" + strs[i];
12+
}
13+
return result;
14+
}
15+
/*
16+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
17+
* - ๋ฌธ์ž ์ˆœํšŒํ•˜๋ฉด์„œ # ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ”
18+
*
19+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
20+
* - ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ์ƒ์„ฑํ•ด์„œ ๋ฆฌํ„ด
21+
*/
22+
function decode(encoded: string): string[] {
23+
return encoded.split("#");
24+
}
25+
26+
// ์Šคํƒ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
27+
/*
28+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
29+
*
30+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
31+
*/
32+
33+
// ["Hello","World"] => 5#Hello5#World
34+
function encode(strs: string[]): string {
35+
let result = "";
36+
for (const str of strs) {
37+
result += `${str.length}#${str}`;
38+
}
39+
return result;
40+
}
41+
42+
/*
43+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
44+
* - ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ํฌํ•จํ•ด์„œ encodeํ•œ ๋’ค decodeํ•  ๋•Œ ๊ธธ์ด ํ™œ์šฉํ—ค์„œ stack์— ๋‹ด๋Š” ๋ฐฉ์‹
45+
*
46+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
47+
* - ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด 1ํšŒ ์ˆœํšŒ
48+
*
49+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
50+
* - n์€ result ๊ธธ์ด
51+
*/
52+
53+
// 5#Hello5#World => ["Hello","World"]
54+
function decode(encoded: string): string[] {
55+
const result: string[] = [];
56+
let index = 0;
57+
while (index < encoded.length) {
58+
const separatorIndex = encoded.indexOf("#", index);
59+
const length = parseInt(encoded.slice(index, separatorIndex), 10);
60+
index = separatorIndex + 1;
61+
const str = encoded.slice(index, index + length);
62+
result.push(str);
63+
index += length;
64+
}
65+
66+
return result;
67+
}

โ€Žgroup-anagrams/mmyeon.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
*
3+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
4+
* - group anagrams ์ €์žฅํ•  map ์„ ์–ธํ•˜๊ธฐ
5+
* - ๋‹จ์–ด ๋ฌธ์ž์—ด strs ์ˆœํšŒํ•˜๋ฉด์„œ ๋‹จ์–ด ์ •๋ ฌํ•˜๊ธฐ
6+
* - map์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋งต์— ์ €์žฅํ•˜๊ธฐ.
7+
* - map์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธฐ์กด ๊ฐ’์— ํ˜„์žฌ ๋‹จ์–ด ์ถ”๊ฐ€ํ•˜๊ธฐ
8+
* - map์˜ ๊ฐ’๋“ค๋งŒ ๋ฆฌํ„ดํ•˜๊ธฐ
9+
*
10+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n * klogk)
11+
* - n์€ strs ๊ธธ์ด, k๋Š” ๋‹จ์–ด ๊ธธ์ด
12+
* - strs ๋ฐฐ์—ด n๋ฒˆ ์ˆœํšŒ : O(n)
13+
* - ๊ฐ ๋‹จ์–ด ์ •๋ ฌ : O(klogk)
14+
*
15+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
16+
* - map์— strs ๊ธธ์ด๋งŒํผ ์ €์žฅํ•˜๋‹ˆ๊นŒ
17+
*/
18+
function groupAnagrams(strs: string[]): string[][] {
19+
const map = new Map<string, string[]>();
20+
21+
for (const str of strs) {
22+
const sortedWord = str.split("").sort().join("");
23+
if (map.get(sortedWord)) {
24+
map.get(sortedWord)!.push(str);
25+
} else {
26+
map.set(sortedWord, [str]);
27+
}
28+
}
29+
30+
return [...map.values()];
31+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
class TrieNode {
2+
children: Map<string, TrieNode>;
3+
isEndOfWord: boolean;
4+
5+
constructor() {
6+
// ํ‚ค : ๋ฌธ์ž, ๊ฐ’ : ๋‹ค์Œ ๋ฌธ์ž ๋…ธ๋“œ
7+
this.children = new Map();
8+
this.isEndOfWord = false;
9+
}
10+
}
11+
12+
/**
13+
* @link https://leetcode.com/problems/implement-trie-prefix-tree/description/
14+
*
15+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
16+
* - root ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๊ฐ ๋ฌธ์ž์—ด์„ children๋…ธ๋“œ์— ์ €์žฅํ•œ๋‹ค.
17+
* - ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์ผ ๋•Œ ๋์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ isEndOfWord๊ฐ’์„ true๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
18+
* - insert : ๊ฐ ๋ฌธ์ž์—ด ์ˆœํšŒํ•˜๋ฉด์„œ, ๋ฌธ์ž์— ๋Œ€ํ•œ children๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑํ•ด์„œ ๋ฌธ์ž์™€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
19+
*
20+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
21+
* - ๋ฌธ์ž ๊ธธ์ด n ๋งŒํผ ๋ฌธ์ž ์‚ฝ์ž…ํ•จ
22+
*
23+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
24+
* - ์ตœ๋Œ€ ๋ฌธ์ž์—ด ๊ธธ์ด๋งŒํผ ๋…ธ๋“œ ์ถ”๊ฐ€๋จ
25+
*/
26+
27+
class Trie {
28+
root: TrieNode;
29+
30+
constructor() {
31+
this.root = new TrieNode();
32+
}
33+
34+
insert(word: string): void {
35+
let currentNode = this.root;
36+
37+
for (const letter of word) {
38+
// ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ ์ž์‹ ๋…ธ๋“œ์— ์žˆ์œผ๋ฉด ์ด๋™
39+
// ์—†์œผ๋ฉด ์ƒˆ ๋…ธ๋“œ ์ƒ์„ฑํ•ด์„œ ์ถ”๊ฐ€ํ•˜๊ธฐ
40+
if (!currentNode.children.has(letter)) {
41+
currentNode.children.set(letter, new TrieNode());
42+
}
43+
// ์ž์‹ ๋…ธ๋“œ๋กœ ์ด๋™
44+
currentNode = currentNode.children.get(letter) as TrieNode;
45+
}
46+
currentNode.isEndOfWord = true;
47+
}
48+
49+
search(word: string): boolean {
50+
let currentNode = this.root;
51+
52+
for (const letter of word) {
53+
if (!currentNode.children.has(letter)) return false;
54+
currentNode = currentNode.children.get(letter) as TrieNode;
55+
}
56+
return currentNode.isEndOfWord;
57+
}
58+
59+
startsWith(prefix: string): boolean {
60+
let currentNode = this.root;
61+
62+
for (const letter of prefix) {
63+
if (!currentNode.children.has(letter)) return false;
64+
currentNode = currentNode.children.get(letter) as TrieNode;
65+
}
66+
return true;
67+
}
68+
}
69+
70+
/**
71+
* Your Trie object will be instantiated and called as such:
72+
* var obj = new Trie()
73+
* obj.insert(word)
74+
* var param_2 = obj.search(word)
75+
* var param_3 = obj.startsWith(prefix)
76+
*/

โ€Žword-break/mmyeon.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// "leetcode"
2+
// [ true, false, false, false, true, false, false, false, true ]
3+
/**
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• : DP ๋ฐ”ํ…€์—… ๋ฐฉ์‹
5+
* - ๋ฌธ์ž์—ด ๋Š˜๋ ค๊ฐ€๋ฉด์„œ, ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์— wordDict์— ํฌํ•จ๋˜๋Š”์ง€ ์ฒดํฌ
6+
*
7+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n^2)
8+
* - n์€ ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด
9+
* - ์™ธ๋ถ€ ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋ฌธ์ž์—ด ์ˆœํšŒ(n๋ฒˆ), ๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ตœ๋Œ€ n๋ฒˆ ์ˆœํšŒ
10+
*
11+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
12+
* - ๋ฌธ์ž์—ด ๊ธธ์ด n๋งŒํผ dp ๋ฐฐ์—ด ์ €์žฅ
13+
*/
14+
function wordBreak(s: string, wordDict: string[]): boolean {
15+
const set = new Set(wordDict);
16+
const dp = Array(s.length + 1).fill(false);
17+
// ๋นˆ ๋ฌธ์ž์—ด์€ ํ•ญ์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ true
18+
dp[0] = true;
19+
20+
// i๋Š” ๋ฌธ์ž์—ด์˜ ๋ ์ธ๋ฑ์Šค
21+
for (let i = 1; i <= s.length; i++) {
22+
// j๋Š” ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค
23+
for (let j = 0; j < i; j++) {
24+
if (dp[j] && set.has(s.substring(j, i))) {
25+
dp[i] = true;
26+
break;
27+
}
28+
}
29+
}
30+
31+
return dp[s.length];
32+
}

0 commit comments

Comments
ย (0)