문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
두 단어가 서로의 애너그램인 경우, 그 문자들을 재배열해서 다른 단어를 형성할 수 있다.
문자열이 주어지고, 그것을 두개의 같은 길이의 연속된 부분 문자열로 나눈다. 두 부분 문자열을 서로 애너그램으로 만들기 위해 변경해야 하는 최소 문자 수를 결정해라.
s = abccde
두 부분 'abc'와 'cde'로 나눠라. 모든 글자가 사용되고, 부분 문자열은 연속되며 길이가 같다. 이제 첫 번째 부분 문자열의 'a'와 'b'를 'd'와 'e'로 변경하면 'dec'와 'cde'로 만들 수 있다. 이 두 문자열은 애너그램이다. 두 번의 변경이 필요하다.
anagram 함수를 완성해라.
anagram 함수는 아래와 같은 매개변수를 가지고 있다.
먼저 주어진 문자열 s의 길이가 홀수면 -1을 리턴한다. 왜냐하면 문자열을 같은 일이로 나눠야하는데 홀수면 같은 길이로 나눌 수 없기 때문이다.
if(s.length() % 2 == 1){
return -1;
}
바꿔야하는 문자의 수를 담을 changeCount를 선언하고 0을 할당한다. 그리고 문제에 주어진 anagram 메소드 밖에 int[]를 반환하는 getInputCount 메소드를 생성한다. getInputCount 메소드는 주어진 문자열에서 각 알파벳 개수를 구해줘야한다. 메소드를 통해 int 배열 s1과 s2를 생성하고 각각 s를 반으로 자른 문자열을 매개변수로 담아준다.
int changeCount = 0;
int[] s1 = getInputCount(s.substring(0, s.length() / 2));
int[] s2 = getInputCount(s.substring(s.length() / 2, s.length()));
public static int[] getInputCount(String input){
int[] inputCount = new int[26];
for(int i = 0; i < input.length(); i++){
inputCount[input.charAt(i) - 'a']++;
}
return inputCount;
}
그리고 for문을 통해 순회한다. 이때 s1을 기준으로 s1의 해당 문자 수가 s2보다 많을때 changeCount에 더한다.
for(int i = 0; i < 26; i++){
if(s1[i] > s2[i]){
changeCount += s1[i] - s2[i];
}
}
마지막으로 changeCount를 반환한다.
return changeCount;
public static int anagram(String s) {
if(s.length() % 2 == 1){
return -1;
}
int changeCount = 0;
int[] s1 = getInputCount(s.substring(0, s.length() / 2));
int[] s2 = getInputCount(s.substring(s.length() / 2, s.length()));
for(int i = 0; i < 26; i++){
if(s1[i] > s2[i]){
changeCount += s1[i] - s2[i];
}
}
return changeCount;
}
public static int[] getInputCount(String input){
int[] inputCount = new int[26];
for(int i = 0; i < input.length(); i++){
inputCount[input.charAt(i) - 'a']++;
}
return inputCount;
}