[Codility] Family에서 가장 큰 sibling 찾기

code4109·2022년 11월 1일

coding dojo

목록 보기
2/6
  • 두 양의 정수가 서로의 숫자를 재배치해 서로를 얻을 수 있는 조건이면 sibling이라고 한다.
    • 예를 들어 123과 321은 sibling, 535와 355도 sibling이다.
  • 양의 정수 N의 sibling이 모인 집합을 family라고 한다.
    • 예를 들어 553의 family는 355, 535, 553이라고 할 수 있다.
  • 주어진 양의 정수 N의 family 중에서 가장 큰 수를 반환하는 함수를 구현해라.
    • 예를 들어 N=213이라면 function의 리턴값은 321, N=553이라면 553을 리턴하면 된다.
  • 조건
    • N은 범위가 [0..10000]인 정수
import java.util.*;

class solution {
  public int solution(int N) {
    // argument N을 문자열 배열로 변환
    String[] nStrArr = Integer.toString(n).split("");
    // 문자열 배열의 각 digit을 넣어둘 int 배열 선언
    Integer[] arr = new Integer[nStrArr.length];
    
    // 위에서 만든 int 배열에 문자열 배열의 digit을 int로 변환해서 삽입
    for (int i = 0; i < arr.length; i++) {
      arr[i] = Integer.parseInt(nStrArr[i]);
    }
    
    // int 배열을 내림차순으로 정렬(어차피 sibling 중에서 제일 큰 수는 인수를 내림차순으로 정렬한 것)
    Arrays.sort(arr, Collections.reverseOrder());
    
    // int 배열을 하나의 digit으로 만들기 위해 StringBuffer 사용
    StringBuffer sb = new StringBuffer();
    for (Integer elm : arr) {
      sb.append(elm);
    }

    // int로 변환해서 리턴
    return Integer.parseInt(sb.toString());
  }
}
  • 너무 장황한 것 같아서 잘 생각해 보니 Stream을 쓸 수 있을 것 같아 다시 해봤다.
public int solution(int N) {
  // 4. int로 변환
  return Integer.parseInt(
          // 1. 첫 해법과 마찬가지로 인수 N을 배열로 변환
          Stream.of(Integer.toString(N).split(""))
                 // 2. 내림차순 정렬
                .sorted(Comparator.reverseOrder())
                // 3. 내림차순으로 정렬된 배열을 모아서 문자열로 만듦
                .collect(Collectors.joining()));
}

0개의 댓글