더북(TheBook)

Set 대신 List를 사용하면 출력은 다음과 같다(보다시피 중복이 있다).

TEST TETS TSTE TSET TTES TTSE ESTT ESTT ETTS ETST ETST ETTS STTE STET STET STTE SETT SETT TTES TTSE TEST TETS TSTE TSET

순열이 총 24개다. n의 계승(n!)을 계산해 쉽게 순열의 개수를 알아낼 수 있다. n=4(문자열의 길이)이면 4! = 4 × 3 × 2 × 1 = 24다. 재귀적으로 나타내면 n! = n × (n - 1)!이다.

Info ≣ n!은 매우 빠르게 높은 수를 내므로(가령 10! = 3628800) 결과를 저장하지 않는 것이 바람직하다. HELICOPTER 같은 문자 10개짜리 문자열은 순열이 무려 3,628,800개다!

위 해법을 자바 8 함수형 스타일로 구현하면 다음과 같다.

private static void permuteAndPrintStream(String prefix, String str) {
  int n = str.length();

  if (n == 0) {
    System.out.print(prefix + " ");
  } else {
    IntStream.range(0, n)
      .parallel()
      .forEach(i -> permuteAndPrintStream(prefix + str.charAt(i),
        str.substring(i + 1, n) + str.substring(0, i)));
  } 
}

덧붙여 Stream<String>을 반환하는 해법은 이 책의 예제 코드를 확인하자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.