늘 겸손하게

Leetcode Q : Valid Anagram 본문

코딩 문제/LeetCode

Leetcode Q : Valid Anagram

besforyou999 2021. 2. 13. 11:45

February LeetCoding Challenge 2021 ( Week 2, day 11 )

Q : Valid Anagram

 

문제 해설

문자열 s와 t 가 주어질 때, ts의 anagram 인지 판별하는 함수를 작성하라

 

anagram : 문자 배치를 바꾸면 같아지는 문자열

 

ex)

- listen 은 silent의 anagram ( listen의 문자 배치를 바꾸면 silent로 만들 수 있으므로)

- nagaram 은 anagram의 anagram ( nagaram의 문자 배치를 바꾸면 anagram로 만들 수 있으므로)

 

 

문제 풀이

1. 문자열 s와 t 들의 문자들을 오름차순으로 정렬

2. 정렬한 문자열 s와 t가 같은 지 판별

3. 같다면 return true

4. 다르다면 return false

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public boolean isAnagram(String s, String t) {
        
        if(s.length() != t.length() ) {
            return false;
        }
        
        char [] s_arr = s.toCharArray();
        char [] t_arr = t.toCharArray();
        
        Arrays.sort(s_arr);
        Arrays.sort(t_arr);
        
        s = new String(s_arr);
        t = new String(t_arr);
        
        if(s.equals(t)) {
              return true;
          }
        
        return false;
    }
}
cs

 

 

코드 설명

 

String 클래스의 메서드(method)인 toCharArray()를 이용하여

char형 배열에 문자열 반환한 뒤

 

char형 배열을 정렬

정렬된 문자열을 String 클래스 s 와 t 에 재할당

 

String 클래스의 매소드인 equals(Object object)를 이용해 st 가 같은 지 판별

 

 

 

 

결과

 

 

Runtime : 2 ms , Your runtime beats 95.86% of java submissions

Memory Usage : 39.1 MB , Your memory usage beats 74.77% of java submissions.

 

 

준수한 성능을 보인다.

 

더 좋은 코드

 

원리는 똑같지만 더 좋은 코드가 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
    public boolean isAnagram(String s, String t) {
        
        if(s.length() != t.length() ) {
            return false;
        }
        
        char [] s_arr = s.toCharArray();
        char [] t_arr = t.toCharArray();
        
        Arrays.sort(s_arr);
        Arrays.sort(t_arr);        
       
        return Arrays.equals(s_arr,t_arr);
    }
}
cs

 

새로운 문자열을 만들 필요 없이 util.Arrays의 메소드를 이용하여 정렬한 문자열 2개를 비교하는 것

 

그럼 메모리 사용량이 0.1 MB 줄어 메모리 사용량에서 91.37%의 코드들을 이긴다.

 

 

최상위 메모리 사용량이 38.5 MB 감안하면 거기서 거기이지만.. 순위가 약 17% 올라간다!

 

 

 

결론

최대한 간단하게 풀자

hashMap을 이용해서 각 문자가 문자열에 몇 개 존재하는지 저장한 뒤, hashMap끼리 비교하는 방법으로  풀려고 해 봤지만 굳이 복잡하게 할 필요가 없다는 것을 깨달았다.( Simple is the best )