Skip to content

Commit bcde25c

Browse files
authored
Merge pull request DaleStudy#687 from Yjason-K/main
[gomgom22] Week1
2 parents 026e627 + 07c3982 commit bcde25c

File tree

5 files changed

+159
-0
lines changed

5 files changed

+159
-0
lines changed

โ€Žcontains-duplicate/Yjason-K.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต ํ™•์ธ (์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) )
3+
* @param nums ์ค‘๋ณต ๊ฒ€์‚ฌํ•  ์ˆซ์ž ๋ฐฐ์—ด
4+
* @returns boolean ์ค‘๋ณต ์—ฌ๋ถ€
5+
*/
6+
7+
function containsDuplicate(nums: number[]): boolean {
8+
let unique: Set<number> = new Set([]);
9+
for (const num of nums) {
10+
if (unique.has(num)) {
11+
return true
12+
} else {
13+
unique.add(num)
14+
}
15+
}
16+
return false;
17+
};
18+

โ€Žhouse-robber/Yjason-K.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ์ธ์ ‘ํ•œ ์ง‘์„ ํ„ธ์ง€ ์•Š๊ณ  ํ›”์น  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธˆ์•ก์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
3+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
4+
* - ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ ์ตœ๋Œ€ ๊ธˆ์•ก์„ ๊ณ„์‚ฐ
5+
* - ๊ณต๊ฐ„ ๋ณต์žก๋„: O(1)
6+
* - ์ถ”๊ฐ€ ๋ฐฐ์—ด ์—†์ด ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฐ„ ํšจ์œจ์„ฑ์„ ์ตœ์ ํ™”
7+
*
8+
* @param {number[]} nums - ๊ฐ ์ง‘์— ์žˆ๋Š” ๋ˆ์˜ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด
9+
* @returns {number} - ๊ฒฝ๋ณด๋ฅผ ์šธ๋ฆฌ์ง€ ์•Š๊ณ  ํ›”์น  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธˆ์•ก
10+
*/
11+
function rob(nums: number[]): number {
12+
if (nums.length === 0) return 0; // ๋นˆ ๋ฐฐ์—ด ์ฒ˜๋ฆฌ
13+
if (nums.length === 1) return nums[0]; // ์ง‘์ด ํ•œ ์ฑ„๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ทธ ์ง‘์˜ ๋ˆ ๋ฐ˜ํ™˜
14+
15+
// 1. ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”: ์ด์ „ ๋‘ ์ง‘๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธˆ์•ก
16+
let prev2 = 0; // ๋‘ ๋ฒˆ์งธ ์ด์ „ ์ง‘๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธˆ์•ก
17+
let prev1 = nums[0]; // ์ฒซ ๋ฒˆ์งธ ์ด์ „ ์ง‘๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธˆ์•ก
18+
19+
// 2. ๋ฐฐ์—ด ์ˆœํšŒ: ๊ฐ ์ง‘์—์„œ ํ›”์น  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธˆ์•ก ๊ณ„์‚ฐ
20+
for (let i = 1; i < nums.length; i++) {
21+
// ํ˜„์žฌ ์ง‘๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธˆ์•ก์€ (ํ˜„์žฌ ์ง‘ + prev2) ๋˜๋Š” prev1 ์ค‘ ๋” ํฐ ๊ฐ’
22+
const cur = Math.max(nums[i] + prev2, prev1);
23+
24+
// ์ด์ „ ๋‘ ์ง‘์˜ ์ตœ๋Œ€ ๊ธˆ์•ก ์—…๋ฐ์ดํŠธ
25+
prev2 = prev1;
26+
prev1 = cur;
27+
}
28+
29+
return prev1; // ๋งˆ์ง€๋ง‰ ์ง‘๊นŒ์ง€์˜ ์ตœ๋Œ€ ๊ธˆ์•ก ๋ฐ˜ํ™˜
30+
}
31+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ๊ธด ์—ฐ์†๋œ ์ˆซ์ž ์‹œํ€€์Šค์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
3+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n)
4+
* - O(n): Set์— ์ˆซ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฐ ์ˆซ์ž๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์—ฐ์†๋œ ์‹œํ€€์Šค๋ฅผ ๊ณ„์‚ฐ
5+
* - ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n)
6+
* - O(n): ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ Set ์‚ฌ์šฉ
7+
*
8+
* @param {number[]} nums - ์ •์ˆ˜ ๋ฐฐ์—ด
9+
* @returns {number} - ๊ฐ€์žฅ ๊ธด ์—ฐ์†๋œ ์ˆซ์ž ์‹œํ€€์Šค์˜ ๊ธธ์ด
10+
*/
11+
function longestConsecutive(nums: number[]): number {
12+
if (nums.length === 0) return 0; // ๋นˆ ๋ฐฐ์—ด ์ฒ˜๋ฆฌ (๊ธธ์ด 0 ๋ฐ˜ํ™˜)
13+
14+
// 1. ๋ฐฐ์—ด์„ Set์— ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ O(n)
15+
const numSet = new Set(nums);
16+
17+
let longestSeq = 0; // ๊ฐ€์žฅ ๊ธด ์—ฐ์† ์‹œํ€€์Šค ๊ธธ์ด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
18+
19+
// 2. ๊ฐ ์ˆซ์ž๊ฐ€ ์‹œํ€€์Šค์˜ ์‹œ์ž‘์ ์ธ์ง€ ํ™•์ธ
20+
for (const num of numSet) {
21+
// ์ˆซ์ž `num`์ด ์‹œํ€€์Šค์˜ ์‹œ์ž‘์ ์ธ์ง€ ํ™•์ธ
22+
// (num-1์ด Set์— ์—†๋‹ค๋ฉด num์€ ์‹œํ€€์Šค์˜ ์‹œ์ž‘์ )
23+
if (!numSet.has(num - 1)) {
24+
// ์ƒˆ๋กœ์šด ์‹œํ€€์Šค ์‹œ์ž‘
25+
let curNum = num;
26+
let curSeq = 1;
27+
28+
// 3. ์‹œํ€€์Šค๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐ O(n)
29+
while (numSet.has(curNum + 1)) {
30+
curNum += 1; // ํ˜„์žฌ ์ˆซ์ž๋ฅผ 1 ์ฆ๊ฐ€
31+
curSeq += 1; // ์‹œํ€€์Šค ๊ธธ์ด๋ฅผ 1 ์ฆ๊ฐ€
32+
}
33+
34+
// 4. ๊ฐ€์žฅ ๊ธด ์‹œํ€€์Šค ๊ธธ์ด๋ฅผ ์—…๋ฐ์ดํŠธ
35+
longestSeq = Math.max(longestSeq, curSeq);
36+
}
37+
}
38+
39+
return longestSeq; // ๊ฐ€์žฅ ๊ธด ์—ฐ์† ์‹œํ€€์Šค์˜ ๊ธธ์ด ๋ฐ˜ํ™˜
40+
}
41+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* ๋ฐฐ์—ด์—์„œ ๊ฐ ์ˆซ์ž์˜ ๋นˆ๋„๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„ ์ƒ์œ„ k๊ฐœ์˜ ๋นˆ๋„ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
3+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n + m log m)
4+
* - O(n): ์ˆซ์ž ๋นˆ๋„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฃจํ”„
5+
* - O(m log m): ๊ณ ์œ  ์ˆซ์ž(m)์— ๋Œ€ํ•œ ์ •๋ ฌ
6+
* - ๊ณต๊ฐ„ ๋ณต์žก๋„: O(m)
7+
* - ๊ณ ์œ  ์ˆซ์ž(m)์— ๋น„๋ก€ํ•œ Map๊ณผ ์ •๋ ฌ๋œ ๋ฐฐ์—ด ์‚ฌ์šฉ
8+
*
9+
* @param {number[]} nums - ์ˆซ์ž ๋ฐฐ์—ด
10+
* @param {number} k - ๋ฐ˜ํ™˜ํ•  ์ƒ์œ„ ๋นˆ๋„ ์š”์†Œ์˜ ๊ฐœ์ˆ˜
11+
* @returns {number[]} ์ƒ์œ„ k๊ฐœ์˜ ๋นˆ๋„ ์š”์†Œ (์ˆœ์„œ๋Š” ์ƒ๊ด€ ์—†์Œ)
12+
*/
13+
function topKFrequent(nums: number[], k: number): number[] {
14+
let numMap = new Map(); // ์ˆซ์ž์˜ ๋นˆ๋„๋ฅผ ์ €์žฅํ•  Map
15+
16+
// 1. ์ˆซ์ž ๋นˆ๋„ Map ์ƒ์„ฑ O(n)
17+
for (const num of nums) {
18+
// Map์— ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ์—†์œผ๋ฉด 1๋กœ ์ดˆ๊ธฐํ™”, ์žˆ์œผ๋ฉด 1 ์ฆ๊ฐ€
19+
const value = numMap.get(num) ? numMap.get(num) + 1 : 1;
20+
numMap.set(num, value);
21+
}
22+
23+
// 2. Map์„ [์ˆซ์ž, ๋นˆ๋„์ˆ˜] ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค ๋นˆ๋„์ˆ˜ ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ O(m log m)
24+
const sortedFrequent = [...numMap.entries()] // Map์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
25+
.sort((a, b) => b[1] - a[1]) // ๋นˆ๋„์ˆ˜ ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
26+
27+
// 3. ์ƒ์œ„ k๊ฐœ์˜ ์ˆซ์ž๋งŒ ์ถ”์ถœ O(k)
28+
.slice(0, k)
29+
30+
// 4. ์ˆซ์ž(key)๋งŒ ์ถ”์ถœ O(k)
31+
.map(entry => entry[0]);
32+
33+
return sortedFrequent;
34+
}
35+
36+

โ€Žvalid-palindrome/Yjason-K.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* ๋ฌธ์ž์—ด์„ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ ๋ฐ ์ˆซ์ž๋งŒ ๋‚จ๊ธฐ๋Š” ๋ณ€ํ™˜ ์œ ํ‹ธ
3+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) (์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์— ๋น„๋ก€)
4+
*
5+
* @param {string} s - ์ •์ œํ•  ๋ฌผ์ž์—ด
6+
* @returns {string} - ์†Œ๋ฌธ์ž ์•ŒํŒŒ๋ฒณ๊ณผ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด
7+
*/
8+
const refinePhrase = (s:string) : string => s.toLowerCase().replace(/[^a-z0-9]/g, '');
9+
10+
11+
/**
12+
* ๋ฌธ์ž์—ด์„ ์ •์ œํ›„ palindrome ์—ฌ๋ถ€ ํ™•์ธ ํ•˜๋Š” ํ•จ์ˆ˜
13+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n) (๋ฌธ์ž์—ด ์ •์ œ + ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜)
14+
*
15+
* @param {string} s palindrome ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ๋ฌธ์ž์—ด
16+
* @returns {boolean} palindrome ์—ฌ๋ถ€
17+
*/
18+
function isPalindrome(s: string): boolean {
19+
const refined = refinePhrase(s);
20+
21+
// two pointer๋ฅผ ํ™œ์šฉํ•œ palindrome ํ™•์ธ O(n)
22+
let left = 0, right = refined.length - 1;
23+
while (left < right) {
24+
if (refined[left] !== refined[right]) {
25+
return false;
26+
}
27+
left++;
28+
right--;
29+
}
30+
31+
return true;
32+
}
33+

0 commit comments

Comments
ย (0)