Skip to content

Commit

Permalink
Merge pull request #877 from Yjason-K/main
Browse files Browse the repository at this point in the history
[gomgom22] Week5
  • Loading branch information
Yjason-K authored Jan 11, 2025
2 parents 75facce + 9260d77 commit 767c2f3
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 0 deletions.
28 changes: 28 additions & 0 deletions best-time-to-buy-and-sell-stock/Yjason-K.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* ์ตœ๋Œ€ ์ด์ต์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
* @param {number[]} prices
* @returns {number}
*
* ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n) (n: ์ฃผ์‹ ๊ฐ€๊ฒฉ ๋ฐฐ์—ด์˜ ๊ธธ์ด)
* ๊ณต๊ฐ„ ๋ณต์žก๋„ : 0(1) (์ถ”๊ฐ€ ์ž๋ฃŒ๊ตฌ์กฐ X)
*/
function maxProfit(prices: number[]): number {
let minPrice = 100001; // ์ง€๊ธˆ๊นŒ์ง€์˜ ์ตœ์†Œ ๊ฐ€๊ฒฉ
let maxProfit = 0; // ์ตœ๋Œ€ ์ด์ต

for (let price of prices) {
// ์ตœ์†Œ ๊ฐ€๊ฒฉ ๊ฐฑ์‹ 
if (price < minPrice) {
minPrice = price;
}

// ํ˜„์žฌ ๊ฐ€๊ฒฉ์—์„œ ์ตœ์†Œ ๊ฐ€๊ฒฉ์„ ๋บ€ ์ด์ต์ด ์ตœ๋Œ€ ์ด์ต๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๊ฐฑ์‹ 
const potentialProfit = price - minPrice;
if (potentialProfit > maxProfit) {
maxProfit = potentialProfit;
}
}

return maxProfit;
}

28 changes: 28 additions & 0 deletions encode-and-decode-strings/Yjason-K.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* @description ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
* @param {string[]} strs - ๋ฌธ์ž์—ด ๋ฐฐ์—ด
* @returns {string} ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด
*
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N)
* - N์€ ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž์—ด ๊ธธ์ด์˜ ํ•ฉ
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
* - ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์—†์Œ
*/
function encode(strs: string[]): string {
return strs.join(':');
}

/**
* @description ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ๋””์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
* @param {string} s - ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด
* @returns {string[]} ๋””์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด
*
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N)
* - N์€ ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
* - ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์—†์Œ
*/
function decode(s: string): string[] {
return s.split(':');
}

34 changes: 34 additions & 0 deletions group-anagrams/Yjason-K.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/**
* ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์—์„œ Anagram์„ ๊ทธ๋ฃนํ™” ํ•ด์„œ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
* @param {string[]} strs - ๋ฌธ์ž์—ด ๋ฐฐ์—ด
* @returns {string[][]} Anagram์„ ๊ทธ๋ฃน ๋ฐฐ์—ด
*
* ๋ฌธ์ž์—ด๋“ค์„ ์ •๋ ฌํ•ด์„œ Map์— ๋‹ด์•„์„œ ์กด์žฌํ•˜๋ฉด ๊ทธ ๋•Œ์˜ ๋ฌธ์ž๋ฅผ value๋กœ ์ถ”๊ฐ€
* ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ value๋กœ ์ถ”๊ฐ€
*
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N * M * log(M))
* - N์€ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์˜ ๊ธธ์ด
* - M์€ ๊ฐ ๋ฌธ์ž์—ด์˜ ํ‰๊ท  ๊ธธ์ด (์ •๋ ฌ ์‹œ๊ฐ„ ๋•Œ๋ฌธ)
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(N * M)
* - ํ•ด์‹œ๋งต์— ์ €์žฅ๋˜๋Š” ๋ฌธ์ž์—ด ๊ทธ๋ฃน ๋•Œ๋ฌธ
*/
function groupAnagrams(strs: string[]): string[][] {
const anagramMap: Map<string, string[]> = new Map();
for (const str of strs) {

// ์ •๋ ฌ๋œ ๋ฌธ์ž์—ด
const sortedStr = str.split('').sort().join('');

// ์ •๋ ฌ๋œ ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๋Š” ์•Š๋Š” ๊ฒฝ์šฐ
if (!anagramMap.has(sortedStr)) {
anagramMap.set(sortedStr, [])
}

// ์ •๋ ฌ๋œ ๋ฌธ์ž์—ด์„ key๋กœ ํ•˜๋Š” value str ์ถ”๊ฐ€
anagramMap.get(sortedStr)?.push(str);
}

// anagramMap์—์„œ values๋งŒ ๋ฐฐ์—ด๋กœํ•ด์„œ ์ถœ๋ ฅ
return Array.from(anagramMap.values())
}

39 changes: 39 additions & 0 deletions word-break/Yjason-K.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/**
* ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์ด ๋‹จ์–ด ์‚ฌ์ „์— ์žˆ๋Š” ๋‹จ์–ด๋“ค๋กœ ๋‚˜๋ˆ„์–ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
*
*
* @param {string} s - ํ™•์ธํ•  ๋ฌธ์ž์—ด
* @param {string[]} wordDict - ๋‹จ์–ด ์‚ฌ์ „
* @returns {boolean} ๋ฌธ์ž์—ด์ด ๋‹จ์–ด๋กœ ์™„๋ฒฝํžˆ ๋‚˜๋ˆ„์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉด `true`, ์•„๋‹ˆ๋ฉด `false`
*
* ์‹œ๊ฐ„ ๋ณต์žก์„ฑ O(n * m * k)
* - n: ๋ฌธ์ž์—ด s ๊ธธ์ด
* - m: ๋‹จ์–ด ์‚ฌ์ „ ๊ธธ์ด
* - k: ๋‹จ์–ด ์‚ฌ์ „ ๋‚ด ๋‹จ์–ด ๊ธธ์ด
*
* ๊ณต๊ฐ„ ๋ณต์žก์„ฑ O(n)
* - ๋ฉ”๋ชจ์ด์ œ์ด์…˜(memo) ๋ฐ ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ ํฌ๊ธฐ๊ฐ€ ๋ฌธ์ž์—ด ๊ธธ์ด n์— ๋น„๋ก€.
*/
function wordBreak(s: string, wordDict: string[]): boolean {
const memo: Record<number, boolean> = {};

/**
* @param {number} start - ํ˜„์žฌ ์‹œ์ž‘ idx
* @returns {boolean} ์ฃผ์–ด์ง„ idx ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉด true
*/
const dfs = (start: number): boolean => {
if (start in memo) return memo[start];
if (start === s.length) return (memo[start] = true);

for (const word of wordDict) {
if (s.startsWith(word, start) && dfs(start + word.length)) {
return (memo[start] = true);
}
}

return (memo[start] = false);
};

return dfs(0);
}

0 comments on commit 767c2f3

Please sign in to comment.