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