Skip to content

Commit fc2d9d9

Browse files
authored
Merge pull request #2078 from Blossssom/main
[Blossssom] WEEK 02 solutions
2 parents 6b59d00 + cd23f6a commit fc2d9d9

File tree

4 files changed

+177
-0
lines changed

4 files changed

+177
-0
lines changed

3sum/Blossssom.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @param nums - 정수 배열
3+
* @returns - 세 요소를 합해 0이 되는 값의 배열
4+
* @description
5+
* - 투 포인터 방식
6+
* - 결국 유니크한 조합을 찾으며 중복을 제외하는 방향
7+
* - 무조건 적인 반복 줄이기가 아닌 효율적 범위 반복을 학습해야함
8+
* - 시간 복잡도 O(N^2)
9+
* - 공간 복잡도 O(log N)
10+
*/
11+
function threeSum(nums: number[]): number[][] {
12+
const answer: number[][] = [];
13+
nums.sort((a, b) => a - b);
14+
15+
for (let i = 0; i < nums.length - 2; i++) {
16+
if (i && nums[i] === nums[i - 1]) {
17+
continue;
18+
}
19+
20+
let left = i + 1;
21+
let right = nums.length - 1;
22+
23+
while (left < right) {
24+
const sum = nums[i] + nums[left] + nums[right];
25+
26+
if (sum === 0) {
27+
answer.push([nums[i], nums[left], nums[right]]);
28+
while (left < right && nums[left] === nums[left + 1]) {
29+
left++;
30+
}
31+
while (left < right && nums[right] === nums[right - 1]) {
32+
right--;
33+
}
34+
left++;
35+
right--;
36+
} else if (sum < 0) {
37+
left++;
38+
} else {
39+
right--;
40+
}
41+
}
42+
}
43+
44+
return answer;
45+
}
46+
47+
const nums = [-1, 0, 1, 2, -1, -4];
48+
threeSum(nums);
49+

climbing-stairs/Blossssom.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* 1 or 2 스텝 가능
3+
* @param n - 꼭대기
4+
* @returns - 꼭대기 까지 도달할 수 있는 방법 수
5+
* @description
6+
* - 결국 패턴은 피보나치
7+
* - 시간 복잡도 O(n)
8+
* - 공간 복잡도 O(1)
9+
*/
10+
11+
// function climbStairs(n: number): number {
12+
// if (n <= 2) {
13+
// return n;
14+
// }
15+
16+
// const dp = Array.from({ length: n + 1 }, () => 0);
17+
// dp[1] = 1;
18+
// dp[2] = 2;
19+
20+
// for (let i = 3; i <= n; i++) {
21+
// dp[i] = dp[i - 1] + dp[i - 2];
22+
// }
23+
// return dp[n];
24+
// }
25+
26+
function climbStairs(n: number): number {
27+
if (n <= 2) {
28+
return n;
29+
}
30+
31+
let prevTwo = 1;
32+
let prevOne = 2;
33+
34+
for (let i = 2; i <= n; i++) {
35+
const current = prevTwo + prevOne;
36+
prevTwo = prevOne;
37+
prevOne = current;
38+
}
39+
40+
return prevOne;
41+
}
42+
43+
const n = 3;
44+
climbStairs(n);
45+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* @param nums - 정수 배열
3+
* @returns - nums[i]를 제외한 요소들의 곱셈 값 배열
4+
* @description
5+
* - 나누기를 통한 풀이는 막힘
6+
* - 왼쪽, 오른쪽으로 순회하며 곱을 누적하기
7+
* - 첫번째 반복 - 처음 값은 자신을 제외한 누적의 전체이므로 1, 이후 부터 누적
8+
* - 두번째 반복 - 마지막 값 또한 자신을 제외한 첫번째 반복의 누적, 이후 부터 미리 누적한 값과 자신을 곱
9+
*
10+
* @description
11+
* - 시간 복잡도 O(n)
12+
* - 공간 복잡도 O(n)
13+
* - 해당 방법을 떠올리지 못해 AI의 도움을 받았는데 수학적 사고가 더 필요하다.
14+
*/
15+
function productExceptSelf(nums: number[]): number[] {
16+
let prev = 1;
17+
let next = 1;
18+
const arr: number[] = [];
19+
20+
for (let i = 0; i < nums.length; i++) {
21+
arr.push(prev);
22+
prev = prev * nums[i];
23+
}
24+
25+
for (let j = nums.length - 1; j >= 0; j--) {
26+
arr[j] = arr[j] * next;
27+
next = next * nums[j];
28+
}
29+
30+
return arr;
31+
}
32+
33+
const nums = [1, 2, 3, 4];
34+
productExceptSelf(nums);
35+
36+

valid-anagram/Blossssom.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* @param s 문자열 1
3+
* @param t 문자열 2
4+
* @returns 두 문자열의 나열을 바꿔 동일한 문자열이 나올 수 있는지 반환
5+
* @description
6+
* - 1. 시간 복잡도: O(n), 공간 복잡도 O(1)
7+
* - 2. 시간, 공간 복잡도는 같지만 1번 보다는 빠름 -> 동시처리,
8+
*/
9+
10+
// function isAnagram(s: string, t: string): boolean {
11+
// if(s.length !== t.length) {
12+
// return false;
13+
// }
14+
// const sMap = new Map();
15+
// for(let i = 0; i < s.length; i++) {
16+
// sMap.has(s[i]) ? sMap.set(s[i], sMap.get(s[i]) + 1) : sMap.set(s[i], 1);
17+
// sMap.has(t[i]) ? sMap.set(t[i], sMap.get(t[i]) - 1) : sMap.set(t[i], -1);
18+
// }
19+
20+
// for(const v of sMap.values()) {
21+
// if(v) {
22+
// return false;
23+
// }
24+
// }
25+
// return true;
26+
// }
27+
28+
function isAnagram(s: string, t: string): boolean {
29+
if (s.length !== t.length) return false;
30+
31+
const hash: Record<string, number> = {};
32+
33+
for (const letter of s) {
34+
hash[letter] = (hash[letter] || 0) + 1;
35+
}
36+
37+
for (const letter of t) {
38+
if (hash[letter] > 0) {
39+
hash[letter] = hash[letter] - 1;
40+
} else {
41+
return false;
42+
}
43+
}
44+
45+
return true;
46+
}
47+

0 commit comments

Comments
 (0)