Skip to content

Commit 27b2e07

Browse files
authored
Merge pull request #717 from mmyeon/main
[mallayon] Week 2
2 parents 8384b91 + 4a59c36 commit 27b2e07

File tree

4 files changed

+194
-0
lines changed

4 files changed

+194
-0
lines changed

โ€Ž3sum/mmyeon.tsโ€Ž

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
*
3+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
4+
* - 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•œ ๊ฐ’์ด 0์ด ๋˜๋Š” ์ˆซ์ž์˜ ์กฐํ•ฉ ์ฐพ๋Š” ๋ฌธ์ œ
5+
* - for๋ฌธ๊ณผ ํˆฌ ํฌ์ธํ„ฐ ์‚ฌ์šฉํ•ด์„œ ์ˆซ์ž ์กฐํ•ฉ ์ฐพ๋„๋ก ์ ‘๊ทผ
6+
* - ํˆฌ ํฌ์ธํ„ฐ ์ด๋™ ์กฐ๊ฑด์„ ์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์—ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
7+
* - ํ•ฉ์ด 0๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ 1 ๊ฐ์†Œํ•˜๊ณ , 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ 1 ์ฆ๊ฐ€
8+
* - ํ•ฉ์ด 0์ธ ๊ฒฝ์šฐ์—๋Š”, ๊ฒฐ๊ณผ๊ฐ’์— ์กฐํ•ฉ ์ €์žฅํ•˜๊ณ , ํฌ์ธํ„ฐ 2๊ฐœ ๋ชจ๋‘ ์ด๋™์‹œํ‚ค๊ธฐ
9+
* - ์กฐํ•ฉ ์ค‘๋ณต ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์™€ ๋‘ ์„ธ ๋ฒˆ์งธ ์ˆซ์ž ์ง€์ •ํ•  ๋•Œ ๊ฐ’ ๊ฐ™์€์ง€ ์ฒดํฌํ•ด์„œ ๊ฐ™์œผ๋ฉด ๋‹ค์Œ ์ˆซ์ž๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ์ฒ˜๋ฆฌ
10+
*
11+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n^2)
12+
* - ๋ฐฐ์—ด ์ •๋ ฌ O(nlogn)
13+
* - for๋ฌธ ์ˆœํšŒํ•˜๊ณ  ๋‚ด๋ถ€์—์„œ while๋ฌธ์œผ๋กœ ์š”์†Œ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋‹ˆ๊นŒ O(n^2)
14+
*
15+
* ๊ณต๊ฐ„๋ณต์žก๋„ :
16+
* - ํฌ์ธํ„ฐ ๋ณ€์ˆ˜, sum ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•ด์„œ O(1)
17+
*
18+
* ๋ฐฐ์šด ์  :
19+
* - Set์„ ํ™œ์šฉํ•ด์„œ ๋งˆ์ง€๋ง‰์— ์ค‘๋ณต ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ฐธ์กฐ๊ฐ’์ด๋ผ์„œ ์›ํ•˜๋Š”๋Œ€๋กœ ๋™์ž‘ ์•ˆํ–ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ’์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ค‘๋ณต ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ถ”๊ฐ€ํ•˜๊ธฐ ์ด์ „์— ์ค‘๋ณต ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹ ๊ณ ๋ คํ•ด๋ณด๊ธฐ.
20+
*/
21+
22+
function threeSum(nums: number[]): number[][] {
23+
const result: number[][] = [];
24+
// ํˆฌ ํฌ์ธํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์—ด ์ •๋ ฌ
25+
nums.sort((a, b) => a - b);
26+
27+
for (let i = 0; i < nums.length - 2; i++) {
28+
// ์ค‘๋ณต ์กฐํ•ฉ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ™์€ ๊ฐ’์ธ ๊ฒฝ์šฐ ๋„˜์–ด๊ฐ€๋„๋ก ์ฒ˜๋ฆฌ
29+
if (i > 0 && nums[i] === nums[i - 1]) continue;
30+
31+
let leftPointer = i + 1,
32+
rightPointer = nums.length - 1;
33+
34+
while (leftPointer < rightPointer) {
35+
const sum = nums[i] + nums[leftPointer] + nums[rightPointer];
36+
37+
if (sum < 0) leftPointer++;
38+
else if (sum > 0) rightPointer--;
39+
else {
40+
result.push([nums[i], nums[leftPointer], nums[rightPointer]]);
41+
42+
// ์ค‘๋ณต ์กฐํ•ฉ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ™์€ ๊ฐ’์ธ ๊ฒฝ์šฐ ๋„˜์–ด๊ฐ€๋„๋ก ์ฒ˜๋ฆฌ
43+
while (
44+
leftPointer < rightPointer &&
45+
nums[leftPointer] === nums[leftPointer + 1]
46+
)
47+
leftPointer++;
48+
while (
49+
leftPointer < rightPointer &&
50+
nums[rightPointer] === nums[rightPointer - 1]
51+
)
52+
rightPointer--;
53+
leftPointer++;
54+
rightPointer--;
55+
}
56+
}
57+
}
58+
59+
return result;
60+
}

โ€Žclimbing-stairs/mmyeon.tsโ€Ž

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
*
3+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• : dp ์‚ฌ์šฉ
4+
* - 3๋ฒˆ์งธ ์Šคํ…๋ถ€ํ„ฐ ์ด์ „ ๊ฐ’ 2๊ฐœ์˜ ํ•ฉ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
5+
* - ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ, ์ €์žฅํ•ด๋†“์€ ์ด์ „๊ฐ’์˜ ํ•ฉ์œผ๋กœ ํ˜„์žฌ๊ฐ’ ๊ตฌํ•˜๊ธฐ
6+
* - ๋‹ค์Œ๊ฐ’ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์ด์ „๊ฐ’์„ ์ด์ „์ด์ „๊ฐ’์œผ๋กœ, ํ˜„์žฌ๊ฐ’์„ ์ด์ „๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ธฐ
7+
* - ํ˜„์žฌ๊ฐ’ ๋ฆฌํ„ดํ•˜๊ธฐ
8+
*
9+
* ์‹œ๊ฐ„๋ณต์žก๋„ :
10+
* - 0๋ถ€ํ„ฐ ์ฃผ์–ด์ง„ n๋ฒˆ์งธ์Šคํ…๊นŒ์ง€ ์ˆœํšŒํ•ด์•ผ ํ•˜๋ฏ€๋กœ O(n)
11+
*
12+
* ๊ณต๊ฐ„๋ณต์žก๋„ :
13+
* - ์ด์ „๊ฐ’ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณ€์ˆ˜ 2๊ฐœ๊ฐ€ ์“ฐ์ด๋ฏ€๋กœ O(1)
14+
*
15+
*/
16+
17+
function climbStairs(n: number): number {
18+
if (n <= 2) return n;
19+
20+
let prevPrevSteps = 1;
21+
let prevSteps = 2;
22+
23+
for (let i = 3; i <= n; i++) {
24+
const currentSteps = prevPrevSteps + prevSteps;
25+
prevPrevSteps = prevSteps;
26+
prevSteps = currentSteps;
27+
}
28+
29+
return prevSteps;
30+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
export class TreeNode {
2+
val: number;
3+
left: TreeNode | null;
4+
right: TreeNode | null;
5+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6+
this.val = val === undefined ? 0 : val;
7+
this.left = left === undefined ? null : left;
8+
this.right = right === undefined ? null : right;
9+
}
10+
}
11+
12+
/**
13+
*
14+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ•
15+
* - preorder๋Š” root -> left -> right ์ˆœ์„œ๋กœ ์ง„ํ–‰๋˜๋‹ˆ๊นŒ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ root๋…ธ๋“œ ๊ฐ’์ธ ์ ์„ ์ด์šฉ
16+
* - preorder์—์„œ root ๋…ธ๋“œ ๊ฐ’ ํŒŒ์•…
17+
* - inorder(left -> root -> right)์—์„œ head ๋…ธ๋“œ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ, ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ์„œ๋ธŒ ๋‚˜๋ˆ„๊ธฐ
18+
* - inorder์˜ ์™ผ์ชฝ ํŠธ๋ฆฌ ๋…ธ๋“œ ๊ฐœ์ˆ˜ ํ™œ์šฉํ•ด์„œ preorder๋„ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋‚˜๋ˆ„๊ธฐ
19+
* - ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์œ„ ๊ณผ์ • ๋ฐ˜๋ณตํ•˜๊ธฐ
20+
* - ์žฌ๊ท€ ํ•จ์ˆ˜ ๊ธฐ์ € ์กฐ๊ฑด์œผ๋กœ ๋นˆ ๋ฐฐ์—ด์ด ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ null์ฒ˜๋ฆฌ
21+
*
22+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
23+
* - forEach๋ฌธ์œผ๋กœ map์— ๊ฐ’ ์ดˆ๊ธฐํ™”ํ•˜๋‹ˆ๊นŒ O(n)
24+
* - dfs๊ฐ€ ๊ฐ ๋…ธ๋“œ ๋ฐฉ๋ฌธํ•ด์„œ ๋…ธ๋“œ ๊ฐœ์ˆ˜ n๋งŒํผ ํ˜ธ์ถœํ•˜๋‹ˆ๊นŒ O(n)
25+
*
26+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
27+
* - indexMap - n์ด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์ผ ๋•Œ map์— ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค ๋ชจ๋‘ ์ €์žฅํ•˜๋‹ˆ๊นŒ O(n)
28+
* - ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ์žฌ๊ท€ ํ˜ธ์ถœ O(n)
29+
*
30+
*/
31+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
32+
// index ๋ฏธ๋ฆฌ map์— ์ €์žฅํ•ด๋‘๊ธฐ
33+
const indexMap = new Map<number, number>();
34+
inorder.forEach((number, index) => indexMap.set(number, index));
35+
36+
// preorder index, inorder range๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ
37+
const dfs = (
38+
preorderIndex: number,
39+
inorderStartIndex: number,
40+
inorderEndIndex: number
41+
): TreeNode | null => {
42+
// ๊ธฐ์ € ์กฐ๊ฑด
43+
if (
44+
!(preorderIndex < preorder.length && inorderStartIndex <= inorderEndIndex)
45+
)
46+
return null;
47+
48+
const rootValue = preorder[preorderIndex];
49+
const inorderRootIndex = indexMap.get(rootValue) as number;
50+
51+
// ์™ผ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ ๋ฒ”์œ„ = inorder ๋ฐฐ์—ด์˜ start๋ถ€ํ„ฐ root์ธ๋ฑ์Šค ์ด์ „๊นŒ์ง€
52+
const left = dfs(
53+
preorderIndex + 1,
54+
inorderStartIndex,
55+
inorderRootIndex - 1
56+
);
57+
// ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ ๋ฒ”์œ„ = root์ธ๋ฑ์Šค ๋‹ค์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€
58+
const right = dfs(
59+
preorderIndex + 1 + (inorderRootIndex - inorderStartIndex),
60+
inorderRootIndex + 1,
61+
inorderEndIndex
62+
);
63+
64+
return new TreeNode(rootValue, left, right);
65+
};
66+
67+
return dfs(0, 0, inorder.length - 1);
68+
}

โ€Žvalid-anagram/mmyeon.tsโ€Ž

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
*
3+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
4+
* - ๋‘ ๋ฌธ์ž ์ •๋ ฌํ•˜๋ฉด O(nlogn)์ด๋‹ˆ๊นŒ ์ •๋ ฌ ๋Œ€์‹  ๊ฐ์ฒด ์‚ฌ์šฉํ•ด์„œ ๋นˆ๋„์ˆ˜ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์„ ํƒ
5+
* - ์ฒซ ๋ฒˆ์จฐ ๋ฌธ์ž์—ด ์ˆœํšŒํ•ด์„œ ๊ฐ์ฒด์— ๋ฌธ์ž๋ณ„ ๋นˆ๋„์ˆ˜ ์ €์žฅํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž์—ด ์ˆœํšŒํ•˜๋ฉด์„œ ๋นˆ๋„์ˆ˜ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ
6+
* - ๋ชจ๋“  ๋ฌธ์ž์˜ ๋นˆ๋„์ˆ˜๊ฐ€ 0์ด ๋˜์–ด์•ผ anagram์ด๋ผ๋Š” ์˜๋ฏธ๋‹ˆ๊นŒ, 0์ธ ๊ฒฝ์šฐ true ๋ฆฌํ„ด
7+
*
8+
* ์‹œ๊ฐ„๋ณต์žก๋„ :
9+
* - ๋‘ ๊ฐ์ฒด for๋ฌธ์œผ๋กœ ์ˆœํšŒํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ O(n)
10+
*
11+
* ๊ณต๊ฐ„๋ณต์žก๋„ :
12+
* - ๋ฌธ์ž ๋นˆ๋„์ˆ˜๋ฅผ ๊ฐ์ฒด์˜ ํฌ๊ธฐ๋Š” ์ž…๋ ฅ ๋ฌธ์ž์—ด ๊ธธ์ด์— ๋น„๋ ˆํ•˜๋‹ˆ๊นŒ O(n)
13+
*
14+
*/
15+
16+
function isAnagram(s: string, t: string): boolean {
17+
// ๋‘ ๋ฌธ์ž์—ด ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” anagram์ด ๋  ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ ์ดˆ๊ธฐ ๋ฆฌํ„ด ์ฒ˜๋ฆฌ
18+
if (s.length !== t.length) return false;
19+
20+
const charCount: Record<string, number> = {};
21+
22+
for (const letter of s) {
23+
charCount[letter] = (charCount[letter] ?? 0) + 1;
24+
}
25+
26+
for (const letter of t) {
27+
if (!charCount[letter]) return false;
28+
charCount[letter]--;
29+
}
30+
31+
for (const count in charCount) {
32+
if (charCount[count] !== 0) return false;
33+
}
34+
35+
return true;
36+
}

0 commit comments

Comments
ย (0)