공부기록

242. Valid Anagram 본문

코테/LeetCode

242. Valid Anagram

코타쿠 2022. 3. 14. 10:05

문제

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

코드

import java.util.*;

class Solution {
    public boolean isAnagram(String s, String t) {

        Map<Character, Integer> sm = new HashMap<>();
        Map<Character, Integer> tm = new HashMap<>();

        for(char c : s.toCharArray()){
            if(sm.get(c) == null)
                sm.put(c, 0);
            sm.replace(c, sm.get(c)+1);
        }

        for(char c : t.toCharArray()){
            if(tm.get(c) == null)
                tm.put(c, 0);
            tm.replace(c, tm.get(c)+1);
        }

        for(char key : sm.keySet()){
            if(tm.get(key) == null)
                return false;
            int left = sm.get(key);
            int right = tm.get(key);
            if(left != right){
                return false;
            }
        }

        for(char key : tm.keySet()){
            if(sm.get(key) == null)
                return false;

            int left = tm.get(key);
            int right = sm.get(key);
            if(left != right){
                return false;
            }

        }


        return true;

    }
}

피드백

먼저 anagram 에 대해 제대로 파악하지 않고 풀었다.
서로가 anagram인 문자열은 각 알파벳의 종류와 각 문자의 갯수가 같을 것이다.
이를 검증하기 위해서는 반드시 서로 교차검증을 해야한다. 다음과 같은 경우가 있기 때문이다

s = "abcd"
t = "abcde"

이런 경우, s에 대해서 t를 비교하면, "abcd"의 갯수가 다 같으니 통과이지만, t에 대해서 s를 비교하면 "e"가 없으니 그렇지 않다.

두 번째로 Integer의 cache에 대해서 이슈가 있었다.
처음에 두 세트를 비교할 때 다음과 같이 비교했다.

sm.get(key) != tm.get(key)

이러면, 먼저 Integer 객체가 튀어나온다. 그렇기 때문에 레퍼런스 값이 다를 수 있고...
근데 Integer 객체는 cacheing을 하지 않나? 했는데 문서를 보니 -128~127 범위에 대해서만 캐싱을 한단다...

public static Integer valueOf​(int i)
Returns an Integer instance representing the specified int value. If a new Integer instance is not required, this method should generally be used in preference to the constructor Integer(int), as this method is likely to yield significantly better space and time performance by caching frequently requested values. This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range.
Parameters:
i - an int value.
Returns:
an Integer instance representing i.
Since:
1.5

따라서 int left = sm.get(key) 와 같이 해줘야 Integer 객체의 auto unboxing이 일어나 실제 원시 값에 대한 비교를 제대로 할 수 있게된다.

출처

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html?is-external=true

'코테 > LeetCode' 카테고리의 다른 글

240. Search a 2D Matrix II  (0) 2022.04.07
96. Unique Binary Search Trees  (0) 2022.03.21
1626. Best Team With No Conflicts  (0) 2022.03.06
202. Happy Number  (0) 2022.02.28
134. Gas Station  (0) 2021.06.06