|
| 1 | +/* |
| 2 | +[문제풀이] |
| 3 | +- char 배열로 맞춰보자 (x) |
| 4 | +- s와 t의 길이가 같아야 한다. |
| 5 | +- 각 철자의 개수가 s와 t 모두 일치하는지 확인한다. (테스트케이스 하나 실패) |
| 6 | +
|
| 7 | +- s 철자의 개수를 세어 놓고, t 철자의 개수는 하나씩 빼서 0을 체크해보자. Map (O) |
| 8 | +time: O(N), space: O(N) |
| 9 | + class Solution { |
| 10 | + public boolean isAnagram(String s, String t) { |
| 11 | + if (s.length() != t.length()) { |
| 12 | + return false; |
| 13 | + } |
| 14 | +
|
| 15 | + Map<Character, Integer> counting = new HashMap<>(); |
| 16 | + for (char ch : s.toCharArray()) { |
| 17 | + counting.put(ch, counting.getOrDefault(ch, 0) + 1); |
| 18 | + } |
| 19 | + for (char ch : t.toCharArray()) { |
| 20 | + if (!counting.containsKey(ch)) { |
| 21 | + return false; |
| 22 | + } |
| 23 | + counting.put(ch, counting.get(ch) - 1); |
| 24 | + } |
| 25 | +
|
| 26 | + return counting.values().stream() |
| 27 | + .allMatch(count -> count == 0); |
| 28 | + } |
| 29 | + } |
| 30 | +
|
| 31 | +- Arrays로 정렬 및 비교를 해보자. (O) |
| 32 | +time: O(NlogN), space: O(N) |
| 33 | + class Solution { |
| 34 | + public boolean isAnagram(String s, String t) { |
| 35 | + if (s.length() != t.length()) { |
| 36 | + return false; |
| 37 | + } |
| 38 | +
|
| 39 | + char[] sToCharArray = s.toCharArray(); |
| 40 | + char[] tToCharArray = t.toCharArray(); |
| 41 | + Arrays.sort(sToCharArray); |
| 42 | + Arrays.sort(tToCharArray); |
| 43 | +
|
| 44 | + return Arrays.equals(sToCharArray, tToCharArray); |
| 45 | + } |
| 46 | + } |
| 47 | +
|
| 48 | +- s 철자의 개수를 세어 놓고, t 철자의 개수는 하나씩 빼서 0을 체크해보자. Array (O) |
| 49 | +time: O(N), space: O(1) |
| 50 | +
|
| 51 | +[회고] |
| 52 | +Arrays처럼 자바에서 제공해주는 util을 잘 활용하지 못한 것 같다.. (띵킹하자!) |
| 53 | +
|
| 54 | +처음 성공한 솔루션 접근법은 좋았는데 왜 성능이 안나왔나.. |
| 55 | +HashMap은 내부적으로 해시 테이블 구조를 사용하므로, 동일한 데이터를 저장하더라도 배열보다 메모리를 더 많이 사용한다. |
| 56 | +또한, 키와 값을 객체 타입으로 저장하기 때문에 오토박싱/언박싱 비용이 발생하고, 해시 계산과 충돌 처리 등의 추가 연산이 필요하다. |
| 57 | +따라서 배열에 비해 느린 것 같다. |
| 58 | +*/ |
| 59 | +class Solution { |
| 60 | + public boolean isAnagram(String s, String t) { |
| 61 | + if (s.length() != t.length()) { |
| 62 | + return false; |
| 63 | + } |
| 64 | + |
| 65 | + int[] counting = new int[26]; |
| 66 | + for (char ch : s.toCharArray()) { |
| 67 | + counting[ch - 'a']++; |
| 68 | + } |
| 69 | + for (char ch : t.toCharArray()) { |
| 70 | + counting[ch - 'a']--; |
| 71 | + } |
| 72 | + |
| 73 | + for (int count : counting) { |
| 74 | + if (count != 0) { |
| 75 | + return false; |
| 76 | + } |
| 77 | + } |
| 78 | + return true; |
| 79 | + } |
| 80 | +} |
0 commit comments