CodeWars 여든 아홉 번째 문제

Updated:

Permutations

public static List<String> singlePermutations(String s) {
    HashSet<String> set = new HashSet<String>();

    char[] charArray = s.toCharArray();

    permutation(set, charArray, 0, charArray.length, charArray.length);

    List<String> list = convertSet(set);

    return list;
}

private static List<String> convertSet(HashSet<String> set) {
    List<String> list = new ArrayList<String>();

    Iterator<String> iter = set.iterator();

    while(iter.hasNext()) {       
        list.add(iter.next());
    }

    return list;
}

static void permutation(HashSet<String> set, char[] arr, int depth, int n, int r) {
    if (depth == r) {
        set.add(String.valueOf(arr));
        return;
    }

    for (int i=depth; i<n; i++) {
        swap(arr, depth, i);
        permutation(set, arr, depth + 1, n, r);
        swap(arr, depth, i);
    }
}

static void swap(char[] arr, int depth, int i) {
    char temp = arr[depth];
    arr[depth] = arr[i];
    arr[i] = temp;
}
  • 순열 문제였다. 그동안 갈고 닦은 재귀함수 실력으로 나름 풀어봤는데 오래 걸렸다.
  • 그래도 이번 문제를 통해 조금 더 재귀에 대한 자신감이 붙었다.
  • 위에 코드는 더 깔끔하게 풀 수 있는데 순열에서 더 나아가 조합 문제를 위해서 일단 남겨놨다.
  • 그리고 위의 코드는 swap을 가지고 하는 건데 visit 배열을 이용해서 풀 수 있는데 그건 내일 가지고 할 예정이다.