React

242. Valid Anagram

Given two strings s and t, return true if t is an anagram of s, and false otherwise.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
Example 1:
Input: s = "anagram", t = "nagaram" Output: true
Plain Text
복사
Example 2:
Input: s = "rat", t = "car" Output: false
Plain Text
복사
Constraints:
1 <= s.length, t.length <= 5 * 104
s and t consist of lowercase English letters.
Follow up: What if the inputs contain Unicode characters? How would you adapt your solution to such a case?

My solution

s, t 두개의 문자열이 있다. 만약 t가 s의 애너그램이면 true를 반환하고, 아니면 false를 반환하라.
애너그램은 보통 원본 글자들 모두 한번씩 사용해서 다른 단어나 구절의 글자들을 재배열해서 만들어낼 수 있는 단어나 구절이다.
Map객체는 키-값 쌍을 보유하고 키의 원래 삽입 순서를 기억합니다 . 모든 값(객체 및 기본 값 모두 )은 키 또는 값으로 사용할 수 있습니다.
map 객체를 사용해 s에 존재하는 각 글자가 몇개 들어있는지 채워두고 해당 객체를 t를 가지고 다시 돌면서 다시 빼주었을 때 Map 객체의 모든 키가 값이 0이 아니라면 둘은 애너그램 관계가 아니다.
엣지케이스를 먼저 처리해줄 수 있다. `t와 s가 다른 길이라면 어차피 애너그램일 수 없다.
if (s.length !== t.length) return false; const hash = {};
JavaScript
복사
Map 객체를 쓰나 객체 리터럴을 쓰나 상관이 없다. 객체리터럴으로 해결한다.
for (let i = 0; i < s.length; i++) { if (hash[s[i]]) hash[s[i]]++; else hash[s[i]] = 1; }
JavaScript
복사
처음에 해당 인덱스를 접근하면 undefined(falsy value)가 된다는 점을 이용해서 if문으로 걸러서 첫 값은 1로 들어가고 그다음부터는 증가하게 했다.
for (let i = 0; i < t.length; i++) { if (hash[t[i]]) hash[t[i]]--; else hash[t[i]] = 1; }
JavaScript
복사
마찬가지로 t를 순회할 때도 없을 때 1, 있을 때 빼나가도록 했다.
그러다가 만약 1을 0으로 만들었는데 다시 접근해서 확인하게 되면 0은 falsy값이라 다시 1로 초기화해준다. 이렇게 되면 어찌됐든 마지막에 0이 아닌 것으로 판단되므로 알고리즘 상의 문제가 없다.

Code

/** * @param {string} s * @param {string} t * @return {boolean} */ const isAnagram = function (s, t) { if (s.length !== t.length) return false; const hash = {}; for (let i = 0; i < s.length; i++) { if (hash[s[i]]) hash[s[i]]++; else hash[s[i]] = 1; } for (let i = 0; i < t.length; i++) { if (hash[t[i]]) hash[t[i]]--; else hash[t[i]] = 1; } for (const key in hash) { if (hash[key] !== 0) return false; } return true; }; describe('Contains Duplicate', () => { it('TC1', () => { expect(isAnagram('anagram', 'nagaram')).toStrictEqual(true); }); it('TC2', () => { expect(isAnagram('rat', 'car')).toStrictEqual(false); }); });
JavaScript
복사