CodeWars 아흔 한 번째 문제
Updated:
Strings Mix
public static String mix(String s1, String s2) {
int[][] array = new int[26][3];
for (char c = 'a'; c <= 'z'; c++) {
int s1Count = s1.replaceAll("[^"+c+"]","").length();
int s2Count = s2.replaceAll("[^"+c+"]","").length();
if(s1Count > 1 || s2Count > 1) {
array[c - 97][0] = c;
if(s1Count > s2Count) {
array[c - 97][1] = s1Count;
array[c - 97][2] = 3;
} else if (s1Count < s2Count) {
array[c - 97][1] = s2Count;
array[c - 97][2] = 2;
} else {
array[c - 97][1] = s2Count;
array[c - 97][2] = 1;
}
}
}
sortArray(array);
return makeResult(array);
}
private static void sortArray(int[][] array) {
Arrays.sort(array, new Comparator<int[]>() {
@Override
public int compare(int[] t1, int[] t2) {
if (t1[1] == t2[1]) {
return t2[2] - t1[2];
}
return t2[1] - t1[1];
}
});
}
private static String makeResult(int[][] array) {
List<String> list = new ArrayList<String>();
for(int i = 0; i < 26 && array[i][1] > 0; i++) {
list.add(prefix(array[i]) + length(array[i]));
}
return String.join("/", list);
}
private static String length(int[] arr) {
String result = "";
for(int i = 0; i < arr[1]; i++) {
result += String.valueOf((char)arr[0]);
}
return result;
}
private static String prefix(int[] arr) {
if(arr[2] == 3) {
return "1:";
} else if(arr[2] == 2) {
return "2:";
} else {
return "=:";
}
}
- 문제는 언뜻보면 쉬워보였다.
- 같이 풀었던 태형이랑 지성이도 그런말 하다가 혼쭐이 났다.
-
정렬 조건이 상당히 까다로웠다. 해석도 자꾸 잘못해서 코드 작성하더 rollback을 여러번 했다.
- Best 코드들의 경우도 코드들이 난잡하거나 까다로웠다.
- 나의 경우 조건에 맞는 알파벳들을 2차원 배열로 저장했다. Best 코드의 경우 저장 변수를 list를 사용하여 Comparator를 사용해서 정렬하였다.
- 처음 내가 짠 코드는 두 문자열에 존재하는 문자들을 count하는게 너무 더러워서 best 코드의 알고리즘을 가져와 리펙토링했다.
- 그래서 훨씬 깔끔해진 느낌이다.
출력 조건
- 출력될 알파벳은 s1, s2 어디에 속하든 2개 존재 이상이어야 한다. (s1에게 한개, s2에 한개라는 의미는 아님)
- 출력될 알파벳 중 가장 많이 존재하는 알파벳부터 출력된다.
- 출력될 알파벳은 자신이 속했던 문자열의 이름(1: or 2:)을 출력한다. 두 문자열에 모두 존재한다면 가장 많이 존재하는 문자열 이름만 출력한다.
- 두 문자열에 모두 존재하고 존재하는 개수도 동일하다면 문자열 이름은 (=:)으로 출력한다.
- 출력될 알파벳들 중에서 개수가 동일하다면, (1:, 2:, =:) 순으로 출력한다.
- 출력될 알파벳은 존재한 개수만큼 출력한다.
- 출력될 알파벳 사이들 사이에 (/)을 넣는다.