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:, =:) 순으로 출력한다.
  • 출력될 알파벳은 존재한 개수만큼 출력한다.
  • 출력될 알파벳 사이들 사이에 (/)을 넣는다.