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