반응형

https://leetcode.com/problems/valid-anagram/description/

 

Valid Anagram - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


문제

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.

풀이

풀이 과정

주어진 두 문자열에 대해서 각 문자열이 Anagram인지 판단하는 문제이다.

Anagram이란 어떤 단어를 구성하고 있는 문자의 순서를 바꾸어서 만들어진 단어를 의미한다.
즉 주어진 문자열 s와 t가 서로의 anagram인지를 판단하는 것은 두 문자열이 길이가 같으면서 같은 문자들로 구성이 되어있는가를 확인하면 된다.

우선 두 문자열의 크기가 다른 경우 anagram이 될 수 없으므로 바로 false를 return 한다.

if(s.length() != t.length()) {
    // 두 문자열의 크기가 다른경우 false를 return
    return false;
}

 

각 문자들을 탐색하기 위해 문자열을 character 배열로 변환하고 map을 하나 선언하여 각 문자들에 대한 값을 저장한다.
만약 map에 없는 값이라면 value를 0으로 넣고 s에 대해서는 값을 1 증가시키고, t에 대해서는 값을 1 감소시킨다

// 각 문자열을 char 배열로 변환
char[] sChar = s.toCharArray();
char[] tChar = t.toCharArray();

// 배열의 각 문자를 key로 하는 map을 만들고
// s 배열의 값은 더하고 t 배열의 값은 빼준다
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < sChar.length; i++) {
    map.put(sChar[i], map.getOrDefault(sChar[i], 0) + 1);
    map.put(tChar[i], map.getOrDefault(tChar[i], 0) - 1);
}

 

탐색이 종료된 후 map의 각 key에 대해서 값이 0이 아닌 값이 있다면 다른 문자열이 존재하는 것이므로 false를 return

// map에서 0이 아닌 값이 있으면 anagram이 될 수 없으므로 false를 return
for(char key : map.keySet()) {
    if(map.get(key) != 0) {
        return false;
    }
}

return true;

최종 코드

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length()) {
            // 두 문자열의 크기가 다른경우 false를 return
            return false;
        }

        // 각 문자열을 char 배열로 변환
        char[] sChar = s.toCharArray();
        char[] tChar = t.toCharArray();
        
        // 배열의 각 문자를 key로 하는 map을 만들고
        // s 배열의 값은 더하고 t 배열의 값은 빼준다
        Map<Character, Integer> map = new HashMap<>();
        for(int i = 0; i < sChar.length; i++) {
            map.put(sChar[i], map.getOrDefault(sChar[i], 0) + 1);
            map.put(tChar[i], map.getOrDefault(tChar[i], 0) - 1);
        }

        // map에서 0이 아닌 값이 있으면 anagram이 될 수 없으므로 false를 return
        for(char key : map.keySet()) {
            if(map.get(key) != 0) {
                return false;
            }
        }

        return true;
    }
}

 

HYOJUN