본문 바로가기
Software Development/Leetcode

Leetcode 242. Valid Anagram

by El스토리 2023. 1. 12.
반응형

242. Valid Anagram

 
 
Easy

 

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

Example 2:

Input: s = "rat", t = "car"
Output: false

 

Constraints:

  • 1 <= s.length, t.length <= 5 * 104
  • s and t consist of lowercase English letters.

 


이번문제는 릿코드 242번 문제 Valid Anagram 입니다.

Anagram 은 두 단어들 또는 문장들이 있을 때, 한 단어 / 문장의 배열 순서만 바꿨을 때 다른 나머지 단어 / 문장과 일치하는 것을 뜻합니다.

예를 들어보면, Example 1 의 anagram 에서 나오는 단어의 빈도수를 적어보겠습니다.

 

단어 빈도수
a 3
n 1
g 1
r 1
m 1

 

Example 1의 다른 단어 nagaram 에서 나오는 단어의 빈도수 역시 위의 표와 일치합니다.

따라서, 한 단어가 다른 단어를 재배치 한 것과 일치하므로 이 두 단어는 서로 Anagram 이라고 할 수 있겠습니다.

한글로 예를 들어보면, 릿코드의 경우 [릿드코, 코드릿, 코릿드, 드릿코, 드코릿] 등이 Anagram 입니다.


/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    if (s.length != t.length) return false;
    
    const hashMap = {};
    for (let i=0; i<s.length; i++) {
        if (!hashMap[s[i]]) {
            hashMap[s[i]] = 0;
        }
        hashMap[s[i]]++;
    }

    for (let j=0; j<t.length; j++) {
        if (!hashMap[t[j]]) {
            return false;
        }
        hashMap[t[j]]--;
    }
    return true;
};

이번 문제의 경우

Map 을 사용해서 풀어보았습니다.

 

일단 인자로 받은 두 단어의 길이가 일치하지 않을 경우, 복잡한 연산 없이 바로 false 를 리턴할 수 있습니다.

두 단어의 길이가 같지 않으면 Anagram 이 아니겠죠?

그리고 난 직후 map 오브젝트를 생성하고, 처음 인자로 받은 's' string으로 for 루프를 돕니다.

key가 null 일 경우(initialize 되지 않은 경우)에는 해쉬맵에 0을 대입합니다.

모든 s의 문자들에 대해 증감연산자를 통해 1씩 값을 증가시켜줍니다.

 

첫번째 for 루프가 돈 직후의 hashMap 모습입니다.

첫 값을 0으로 해주고 모든 값에 대해 1을 증가 시켜줌으로 첫번째 인자 's'에 대해 hashMap 을 완성했습니다.


이제 두번째 't' 스트링으로 for loop 를 돌려봅니다.

이때는 hashMap[t[j]] 의 값이 null 이거나 0일 경우, 두 단어가 서로 anagram 이 아니므로 바로 false를 리턴할 수 있습니다.

hashMap[t[j]] 의 값이 null 이거나 0일 경우 둘다

if (!hashMap[t[j]])

으로 확인이 가능합니다.

  1. hashMap[t[j]]의 값이 null 일 경우 - 's'스트링에 없는 알파벳이 't' 스트링에 나온 경우 입니다. 당연히 Anagram이 될 수 없습니다.
  2. hashMap[t[j]]의 값이 0일 경우 - 's'스트링의 해당 알파벳 빈도수 보다 't' 스트링에 해당 알파벳 빈도수가 많은 경우 입니다.

모든 루프를 돌게 되면 인자로 받은 두 단어의 길이가 같으므로 해쉬맵을 다시 검사 해 볼 필요 없이, 두 단어는 Anagram 이 됩니다.

따라서 true를 마지막에 별도의 검사 없이 리턴해줍니다.


Map이용 성능

 

Time Complexity 의 경우 O(n)이 됩니다. 루프를 두 번 돌지만 각각 돌았기 때문에 s, t 스트링의 길이만큼 돌기 때문입니다.

Space Complexity 의 경우 O(n)이 됩니다. 최악의 경우 모든 알파벳이 1번 등장할 수 있기 때문에 hashMap 에 모든 단어의 빈도수가 1로 등록이 되기 때문입니다.


Valid Anagram 의 경우 Junior Software Developer 포지션 인터뷰 질문에서 나오는 빈도수가 꽤 높은 편입니다.

연습 많이 하셔서 꼭 원하시는 결과 얻으시길 바랍니다!

 

※ 앞으로 모든 문제를 JavaScript 로 올릴 예정입니다.

 

다른 문제 풀이도 깃헙에서 확인 있습니다.

 

반응형

'Software Development > Leetcode' 카테고리의 다른 글

Leetcode 238. Product of Array Except Self  (0) 2023.01.19
Leetcode 347. Top K Frequent Elements  (0) 2023.01.15
Leetcode 49. Group Anagrams  (0) 2023.01.14
Leetcode 1. Two Sum  (0) 2023.01.12
Leetcode 217. Contains Duplicate  (0) 2023.01.11

댓글