
문제링크: 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;
}
}