[알고리즘] Leetcode_242_Valid_Anagram

jeongjwon·2023년 5월 30일
0

알고리즘

목록 보기
46/48

Problem


Solve

일단 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 을 이용하면 되겠다 싶었다.

  1. 예외처리
    매개변수로 전달받은 두 문자열의 길이가 다를 경우에는 동일한 개수가 가질 수 없으므로 false 를 반환한다.

  2. 그 외
    길이가 같은 경우에 문자열 s가 가지고 있는 문자를 map 을 이용해 <문자열, 개수> 로 정리해준다.
    2-1. 정리해준 map 에서 문자열 t가 가지고 있는 문자가 map 에 포함이 되지 않는다면 동일하지 않으므로 false 를 반환한다.
    2-2. 포함이 된다면 개수를 줄여준다.

  3. 문자열 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);

0개의 댓글