[LeetCode][JAVA] 1347. Minimum Number of Steps to Make Two Strings Anagram

이호준·2024년 1월 13일
0

LeetCode

목록 보기
7/11

문제링크: 1347. Minimum Number of Steps to Make Two Strings Anagram


📖 문제설명

길이가 같은 두 문자열 s,t가 주어졌을 때 s에서 몇 글자를 수정하면 t문자열과 같아지는 지 최소 수정값을 반환하시오.

💡 접근방식

두 문자열중 하나를 기준으로 문자의 개수를 파악하여 저장을 한 후 다른 문자열을 한글자씩 확인하여 저장된 정보에서 빼는 작업을 반복하여 남은 글자의 개수를 확인 후 반환한다.
특정 문자를 키로 하고 개수를 값으로 사용하면 순서도 중복도 혀용하지 않는 맵 자료구조와 잘 어울려서 해시맵을 사용하여 정보를 관리하였다.

코드:

class Solution {
    public int minSteps(String s, String t) {
        Map<Character, Integer> c = new HashMap<>();
        char[] sC = s.toCharArray();
        char[] tC = t.toCharArray();
        
        for(char i : tC){
            if(c.containsKey(i)){
                Integer value = c.get(i) + 1;
                c.replace(i, value);
                continue;
            }
            c.put(i, 1);
        }
        for(char i : sC){
            if(c.containsKey(i)){
                Integer value = c.get(i)-1;
                if(value == 0) c.remove(i);
                else c.replace(i, value);
            }
        }

        int ans = 0;
        for(Integer value : c.values()){
            ans += value;
        }

        return ans;
    }
}

📌 개선

복잡한 자료구조를 사용할 필요 없이 자바에서는 유니코드에 기반하여 문자를 표현하므로 자바의 문자 자료형인 char형은 그 문자에 해당하는 정수 값을(아스키 코드값)을 저장합니다. 그러므로 알파뱃 갯수에 해당하는 배열을 생성한 후 알파뱃의 가장 첫번째인 소문자 'a'를 감산하면 [0,26]의 값이 나오므로 아래와 같이 코드를 수정할 수 있습니다.

코드:

class Solution {
    public int minSteps(String s, String t) {
        int[] charFreq = new int[26];

        for(int idx=0; idx < s.length(); idx++) {
            charFreq[s.charAt(idx)-'a']++;
            charFreq[t.charAt(idx)-'a']--;
        }

        int minSteps = 0;

        for(int idx=0; idx < 26; idx++) {
            minSteps += Math.max(0, charFreq[idx]);
        }

        return minSteps;
    }
}
profile
나아가는 중입니다.

0개의 댓글