Skip to content

Commit 307cc55

Browse files
committed
solve: validAnagram
1 parent c4e76c6 commit 307cc55

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

valid-anagram/b41-41.ts

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

0 commit comments

Comments
 (0)