Skip to content

Commit 8f34c97

Browse files
authored
Merge pull request #1215 from b41-41/main
2 parents bc9274a + e35e22e commit 8f34c97

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed

climbing-stairs/b41-41.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
function climbStairs(n: number): number {
2+
// 방법 1: (Failed)
3+
// Set 객체에 '1', '2'를 담고 while문으로 계속 증가시키면서 계산하는 방법
4+
5+
// 시간 복잡도: O(n * 2^n) - 각 단계마다 가능한 모든 조합을 생성하므로 지수적으로 증가
6+
// 공간 복잡도: O(2^n) - 최악의 경우 모든 가능한 조합을 저장해야 함
7+
// 실패 이유: 시간 초과
8+
const getResult1 = (): number => {
9+
const currentSet = new Set<string>(['1', '2']);
10+
const resultSet = new Set<string>();
11+
12+
while (currentSet.size > 0) {
13+
const nextSet = new Set<string>();
14+
15+
currentSet.forEach((path) => {
16+
const sum = [...path].reduce((acc, cur) => acc + parseInt(cur), 0);
17+
if (sum === n) resultSet.add(path);
18+
else if (sum < n) {
19+
nextSet.add(path + '1');
20+
nextSet.add(path + '2');
21+
}
22+
});
23+
24+
currentSet.clear();
25+
nextSet.forEach((v) => currentSet.add(v));
26+
}
27+
28+
return resultSet.size;
29+
};
30+
31+
// 방법 2:
32+
// 앞 2가지 더하기
33+
34+
// 시간 복잡도: O(n) - n까지 한 번의 반복문만 실행
35+
// 공간 복잡도: O(1) - 고정된 변수(prev2, prev1)만 사용하여 추가 메모리 사용 없음
36+
const getResult2 = () => {
37+
if(n <= 2) {
38+
return n;
39+
}
40+
41+
let prev2 = 1;
42+
let prev1 = 2;
43+
for(let i = 3; i <= n; i++) {
44+
const curr = prev2 + prev1;
45+
prev2 = prev1;
46+
prev1 = curr;
47+
}
48+
return prev1;
49+
};
50+
51+
// return getResult1();
52+
return getResult2();
53+
};

valid-anagram/b41-41.ts

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
function isAnagram(s: string, t: string): boolean {
2+
/* 방법 1:
3+
* 문자열을 순서대로 정렬 후 맞는지 비교한다.
4+
5+
* 시간 복잡도: O(n log n) - 문자열 정렬에 O(n log n) 시간이 소요됨
6+
* 공간 복잡도: O(n) - 정렬된 문자열을 저장하기 위한 추가 배열 필요
7+
*/
8+
const checkAnagramFromSort = (): boolean => {
9+
if (s.length !== t.length) {
10+
return false;
11+
}
12+
13+
const sortedS: string[] = [...s].sort();
14+
const sortedT: string[] = [...t].sort();
15+
16+
for(let i = 0; i < s.length; i++) {
17+
console.log(sortedS[i], sortedT[i]);
18+
if(sortedS[i] !== sortedT[i]) {
19+
return false;
20+
}
21+
}
22+
23+
return true;
24+
}
25+
26+
/* 방법 2: (Failed)
27+
* Size 체크 후 Set객체에 s단어를 할당한 후 t에서 has메소드로 체크
28+
29+
* 시간 복잡도: O(n) - 문자열을 한 번씩 순회
30+
* 공간 복잡도: O(k) - k는 고유 문자의 수 (최대 알파벳 개수만큼)
31+
* 실패 이유: Set 객체를 사용하여 중복 문자가 사라지기 때문에 정상적인 비교가 불가
32+
*/
33+
const checkAnagramFromSetObject = (): boolean => {
34+
const sSet = new Set(s);
35+
const tSet = new Set(t);
36+
37+
if (s.length !== t.length) {
38+
return false;
39+
} else {
40+
for(let str of sSet) {
41+
if(!tSet.has(str)) {
42+
return false;
43+
}
44+
}
45+
46+
return true;
47+
}
48+
};
49+
50+
/* 방법3:
51+
* countMap을 만들어 둠
52+
* Map<string, number> 타입
53+
* S, T의 길이가 일치한다는 가정 하에
54+
* S는 알파벳마다 +1을 T는 -1을 계산
55+
* 값이 0이 되는 순간 항상 삭제
56+
* 전부 돌았을 때 countMap.size가 0인 경우 true
57+
*
58+
* 시간 복잡도: O(n) - 문자열을 한 번만 순회
59+
* 공간 복잡도: O(k) - k는 고유 문자의 수 (최대 알파벳 개수만큼)
60+
*/
61+
const checkAnagramFromCountMap = ():boolean => {
62+
if(s.length !== t.length) return false;
63+
64+
const countMap = new Map<string, number>();
65+
66+
for(let i = 0; i < s.length; i++) {
67+
const sWord = s[i];
68+
const tWord = t[i];
69+
70+
const prevSValue = countMap.get(sWord) ?? 0;
71+
const nextSValue = prevSValue + 1;
72+
if(nextSValue === 0) {
73+
countMap.delete(sWord)
74+
} else {
75+
countMap.set(sWord, nextSValue);
76+
}
77+
78+
const prevTValue = countMap.get(tWord) ?? 0;
79+
const nextTValue = prevTValue - 1;
80+
if (nextTValue === 0) {
81+
countMap.delete(tWord)
82+
} else {
83+
countMap.set(tWord, nextTValue);
84+
}
85+
};
86+
87+
return countMap.size === 0;
88+
89+
};
90+
91+
// return checkAnagramFromSort();
92+
// return checkAnagramFromSetObject();
93+
return checkAnagramFromCountMap();
94+
};

0 commit comments

Comments
 (0)