일단 Anagram 이란 두 개의 문자열이 동일한 문자로 구성되어 있는 경우를 말한다. 동일한 문자와 동일한 개수로 이루어져야 한다.
문제 예제 1번을 먼저 살펴보자.
문자열 s는 'a'가 3번, 'n'이 1번, 'g'가 1번, 'r'이 1번, 'm'이 1번
, 그리고 문자열 t 또한 'a'가 3번, 'n'이 1번, 'g'가 1번, 'r'이 1번, 'm'이 1번
로 동일한 문자와 동일한 개수를 가지고 있다.
이를 가지고 Map 을 이용하면 되겠다 싶었다.
예외처리
매개변수로 전달받은 두 문자열의 길이가 다를 경우에는 동일한 개수가 가질 수 없으므로 false 를 반환한다.
그 외
길이가 같은 경우에 문자열 s가 가지고 있는 문자를 map 을 이용해 <문자열, 개수>
로 정리해준다.
2-1. 정리해준 map 에서 문자열 t가 가지고 있는 문자가 map 에 포함이 되지 않는다면 동일하지 않으므로 false 를 반환한다.
2-2. 포함이 된다면 개수를 줄여준다.
문자열 t 을 다 순회한 후에 map이 아직 비어있지 않다면, s와 t가 동일한 문자를 가지고 있지 않다는 의미이므로 true를 반환한다.
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()) return false;
boolean result = false;
HashMap<Character, Integer> map = new HashMap<>();
for(char c: s.toCharArray()){
map.put(c, map.getOrDefault(c, 0)+1);
}
for(char c : t.toCharArray()){
if(!map.containsKey(c)) return false;
else{
int newCount = mapS.get(c) - 1;
if(newCount == 0) map.remove(c);
else map.put(c, newCount);
}
}
// System.out.println(map);
return map.isEmpty() ? true: false;
}
}
코드는 다음과 같다.
하지만 map 메소드 관련으로 리팩토링을 하고자 한다.
정리된 map에서 다시 그 map의 key를 이용해 value를 수정하고자 하는 경우가 많다.
내가 사용한 코드는
if(!map.containsKey(c)) return false;
else{
int newCount = mapS.get(c) - 1;
if(newCount == 0) map.remove(c);
else map.put(c, newCount);
}
key 가 map 에 포함이 되지 않을 경우에 value 값을 감소하는 것이다.
미리 먼저 newCount
를 계산한 후에 0이 된다면 map에서 제거하고, 그렇지 않다면 newCount 로 다시 수정해주는 방법이다.
Key의 값에 대해서 연산 방법에 관한 메서드가 있다. 첫번째 파라미터로는 key를, 두번째 피라미터로는 어떻게 연산할지의 함수를 전달한다.
compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)
computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
: key의 값이 없을 경우에만 Function 이 실행된다. 이 때 Function은 람다식을 사용한다.
computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
: computeIfAbsent
와 반대로 key의 값이 존재할 때만 람다식의 Function 이 실행된다.
따라서, compute
메서드를 이용해서 value 값을 하나 감소한 값이 0이 라면 null로, 있다면 하나 감소한 값으로 계산해주는 방식이다.
세 줄의 코드를 메서드를 이용해서 한 줄을 사용하여 가독성을 높일 수 있다.
map.compute(c, (c, integer) -> (integer-1 == 0) ? null : integer-1);