Skip to content

Commit 0462d07

Browse files
committed
refactor: validAnagram
1 parent 3944c79 commit 0462d07

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

valid-anagram/b41-41.ts

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ function isAnagram(s: string, t: string): boolean {
22
/* 방법 1:
33
* 문자열을 순서대로 정렬 후 맞는지 비교한다.
44
5-
* 복잡도: O(n log n)
5+
* 시간 복잡도: O(n log n) - 문자열 정렬에 O(n log n) 시간이 소요됨
6+
* 공간 복잡도: O(n) - 정렬된 문자열을 저장하기 위한 추가 배열 필요
67
*/
78
const checkAnagramFromSort = (): boolean => {
89
if (s.length !== t.length) {
@@ -25,8 +26,9 @@ function isAnagram(s: string, t: string): boolean {
2526
/* 방법 2: (Failed)
2627
* Size 체크 후 Set객체에 s단어를 할당한 후 t에서 has메소드로 체크
2728
28-
* 복잡도 : O(n)
29-
* 실패 이유 : Set 객체를 사용하여 중복 문자가 사라지기 때문에 정상적인 비교가 불가
29+
* 시간 복잡도: O(n) - 문자열을 한 번씩 순회
30+
* 공간 복잡도: O(k) - k는 고유 문자의 수 (최대 알파벳 개수만큼)
31+
* 실패 이유: Set 객체를 사용하여 중복 문자가 사라지기 때문에 정상적인 비교가 불가
3032
*/
3133
const checkAnagramFromSetObject = (): boolean => {
3234
const sSet = new Set(s);
@@ -46,47 +48,47 @@ function isAnagram(s: string, t: string): boolean {
4648
};
4749

4850
/* 방법3:
49-
* culculateMap을 만들어 둠
50-
* Record<string, number> 타입
51+
* countMap을 만들어 둠
52+
* Map<string, number> 타입
5153
* S, T의 길이가 일치한다는 가정 하에
5254
* S는 알파벳마다 +1을 T는 -1을 계산
5355
* 값이 0이 되는 순간 항상 삭제
54-
* 전부 돌았을 때 culculateMap.size가 0인 경우 true
56+
* 전부 돌았을 때 countMap.size가 0인 경우 true
5557
*
56-
* 복잡도: O(n)
58+
* 시간 복잡도: O(n) - 문자열을 한 번만 순회
59+
* 공간 복잡도: O(k) - k는 고유 문자의 수 (최대 알파벳 개수만큼)
5760
*/
58-
const checkAnagramFromCulculateMap = ():boolean => {
61+
const checkAnagramFromCountMap = ():boolean => {
5962
if(s.length !== t.length) return false;
6063

61-
const culculateMap = new Map<string, number>();
64+
const countMap = new Map<string, number>();
6265

6366
for(let i = 0; i < s.length; i++) {
6467
const sWord = s[i];
6568
const tWord = t[i];
6669

67-
const prevSValue = culculateMap.get(sWord) ?? 0;
70+
const prevSValue = countMap.get(sWord) ?? 0;
6871
const nextSValue = prevSValue + 1;
6972
if(nextSValue === 0) {
70-
culculateMap.delete(sWord)
73+
countMap.delete(sWord)
7174
} else {
72-
culculateMap.set(sWord, nextSValue);
75+
countMap.set(sWord, nextSValue);
7376
}
7477

75-
const prevTValue = culculateMap.get(tWord) ?? 0;
78+
const prevTValue = countMap.get(tWord) ?? 0;
7679
const nextTValue = prevTValue - 1;
7780
if (nextTValue === 0) {
78-
culculateMap.delete(tWord)
81+
countMap.delete(tWord)
7982
} else {
80-
culculateMap.set(tWord, nextTValue);
83+
countMap.set(tWord, nextTValue);
8184
}
8285
};
8386

84-
85-
return culculateMap.size === 0;
87+
return countMap.size === 0;
8688

8789
};
8890

8991
// return checkAnagramFromSort();
9092
// return checkAnagramFromSetObject();
91-
return checkAnagramFromCulculateMap();
93+
return checkAnagramFromCountMap();
9294
};

0 commit comments

Comments
 (0)