File tree Expand file tree Collapse file tree 1 file changed +54
-0
lines changed Expand file tree Collapse file tree 1 file changed +54
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * 두 문자열 s와 t가 서로 애너그램(anagram)인지 확인하는 문제
3
+ * 애너그램: 글자의 배열 순서는 다르지만 구성하는 문자와 각 문자의 개수가 동일한 문자열
4
+ *
5
+ * 접근 방법 몇 가지:
6
+ * 1. 정렬 방식: 두 문자열을 알파벳 순으로 정렬한 후 비교하는 방법
7
+ * 2-1. 문자 카운팅 방식 (객체활용): 각 문자열에 등장하는 문자들의 빈도수를 계산하여 비교하는 방법
8
+ * 2-2. 문자 카운팅 방식 (해시맵 객체활용): 문자를 키로, 빈도수를 값으로 하는 해시맵을 만들어 비교하는 방법
9
+ *
10
+ * 팔로우업 질문: 입력에 유니 코드 문자가 포함되어 있으면 어떻게 해? 그러한 경우에 솔루션을 어떻게 조정할꺼야?
11
+ * JavaScript의 문자열은 기본적으로 UTF-16으로 인코딩되서 유니코드 문자도 처리 가능
12
+ * Map 객체는 어떤 타입의 키도 허용 ➡️ 유니코드 문자를 키로 사용하는 데 문제가 없음
13
+ * (방법 2-1)의 일반 객체도 유니코드 문자를 키로 지원하지만, Map을 사용하는 것이 좀 더 안전 => 해시맵으로 구현 ㄱㄱ
14
+ */
15
+
16
+ /**
17
+ * @param {string } s
18
+ * @param {string } t
19
+ * @return {boolean }
20
+ */
21
+ function isAnagram ( s , t ) {
22
+ // 길이가 다르면 애너그램이 될 수 없음 (빠른 리턴)
23
+ if ( s . length !== t . length ) {
24
+ return false ;
25
+ }
26
+
27
+ const charMap = new Map ( ) ;
28
+
29
+ // 첫 번째 문자열의 각 문자 카운트 증가
30
+ for ( let char of s ) {
31
+ charMap . set ( char , ( charMap . get ( char ) || 0 ) + 1 ) ;
32
+ }
33
+
34
+ // 두 번째 문자열의 각 문자 카운트 감소
35
+ for ( let char of t ) {
36
+ const count = charMap . get ( char ) ;
37
+
38
+ // 해당 문자가 없거나 카운트가 0이면 애너그램이 아님
39
+ if ( ! count ) {
40
+ return false ;
41
+ }
42
+
43
+ charMap . set ( char , count - 1 ) ;
44
+ }
45
+
46
+ // 모든 카운트가 0인지 확인
47
+ for ( let count of charMap . values ( ) ) {
48
+ if ( count !== 0 ) {
49
+ return false ;
50
+ }
51
+ }
52
+
53
+ return true ;
54
+ }
You can’t perform that action at this time.
0 commit comments