[99클럽 코테 스터디_ DAY 11] 정수 내림차순으로 배치

yewon·2024년 8월 1일
0

스터디

목록 보기
11/22
post-thumbnail

정수 내림차순으로 배치

✏️오늘의 문제



💡나의 풀이


  public long solution(long n) {
        long answer = 0;
        String check = Long.toString(n);
        char[] charArray = check.toCharArray();

        Arrays.sort(charArray);
        StringBuilder sortedString = new StringBuilder(new String(charArray)).reverse();

        answer = Long.parseLong(sortedString.toString());
        return answer;
    }

아래는 자릿수를 내림차순으로 정렬하는 Java 메서드의 장점과 단점을 포함한 블로그 포스트 내용입니다.


자릿수를 내림차순으로 정렬하는 Java 메서드

이번 포스트에서는 주어진 숫자의 자릿수를 내림차순으로 정렬하는 Java 메서드를 소개하고, 이 메서드의 장점과 단점에 대해 논의하겠습니다.

코드 설명

public long solution(long n) {
    // 입력 숫자를 문자열로 변환
    String check = Long.toString(n);
    // 문자열을 문자 배열로 변환
    char[] charArray = check.toCharArray();
    
    // 문자 배열을 오름차순으로 정렬
    Arrays.sort(charArray);
    // 정렬된 배열을 문자열로 변환 후 내림차순으로 뒤집기
    StringBuilder sortedString = new StringBuilder(new String(charArray)).reverse();
    
    // 문자열을 long 타입으로 변환하여 반환
    return Long.parseLong(sortedString.toString());
}

메서드 작동 방식

  1. 문자열 변환: 입력된 숫자 n을 문자열로 변환합니다.
  2. 문자 배열 생성: 문자열을 문자 배열로 변환하여 각 자릿수를 개별적으로 다룰 수 있게 합니다.
  3. 정렬: 문자 배열을 오름차순으로 정렬합니다.
  4. 내림차순 변환: 정렬된 배열을 다시 문자열로 변환한 후, 내림차순으로 뒤집습니다.
  5. 숫자로 변환: 최종적으로 내림차순으로 정렬된 문자열을 long 타입으로 변환하여 반환합니다.

장점

  • 간단한 구현: 코드는 직관적이며 이해하기 쉽습니다. 문자열과 배열을 사용하여 구현하므로, 자바의 기본적인 기능만으로도 충분히 작성할 수 있습니다.
  • 유연성: 입력값이 long 타입이기 때문에, 다양한 범위의 숫자를 처리할 수 있습니다.
  • 정렬 기능 활용: 자바의 내장 정렬 기능을 사용하여 효율적으로 자릿수를 정렬할 수 있습니다.

단점

  • 성능 문제: 문자열 변환과 배열 생성 과정이 추가되므로, 대량의 데이터를 처리할 때 성능이 저하될 수 있습니다.
  • 메모리 사용: 문자열과 문자 배열을 생성하기 때문에 메모리 사용량이 증가할 수 있습니다. 특히 큰 숫자를 다룰 때 메모리 부담이 커질 수 있습니다.

💡다른 사람의 풀이

    public long solution(long n) {
        // 입력 숫자를 문자열로 변환한 후 문자 배열로 변환
        char[] charArray = Long.toString(n).toCharArray();
        
        // 문자 배열을 내림차순으로 정렬
        Arrays.sort(charArray);
        
        // 정렬된 배열을 StringBuilder로 내림차순으로 뒤집기
        StringBuilder sortedString = new StringBuilder(new String(charArray)).reverse();
        
        // 문자열을 long 타입으로 변환하여 반환
        return Long.parseLong(sortedString.toString());
    }

코드 설명

  1. 문자열 변환: Long.toString(n).toCharArray()를 사용하여 입력된 숫자를 문자 배열로 변환합니다.
  2. 정렬: Arrays.sort(charArray)로 문자 배열을 오름차순으로 정렬합니다.
  3. 내림차순 변환: StringBuilder를 사용하여 정렬된 배열을 내림차순으로 변환합니다.
  4. 숫자로 변환: 최종적으로 내림차순으로 정렬된 문자열을 Long.parseLong()을 사용하여 long 타입으로 변환하여 반환합니다.

성능

  • 이 코드는 입력값이 최대 10자리까지 가능하므로, 정렬의 시간 복잡도는 O(d log d) (d는 자릿수)입니다. 자릿수가 작기 때문에 충분히 효율적입니다.
  • 메모리 사용을 최소화하고, 내장 메서드를 활용하여 코드의 간결함과 효율성을 높였습니다.


💡다른 사람의 풀이 2


코드 설명

String res = ""; // 전역 변수로 문자열 res를 초기화

public int reverseInt(int n) {
    res = ""; // 메서드 시작 시 res를 초기화
    Integer.toString(n) // 정수 n을 문자열로 변환
        .chars() // 문자열을 문자 스트림으로 변환
        .sorted() // 문자 스트림을 오름차순으로 정렬
        .forEach(c -> res = Character.valueOf((char)c) + res); // 정렬된 문자들을 res 앞에 추가
    return Integer.parseInt(res); // 최종 문자열을 정수로 변환하여 반환
}

각 부분의 기능

  1. 전역 변수:

    • String res = "";는 클래스의 전역 변수로, 결과 문자열을 저장하는 데 사용됩니다. 하지만 전역 변수를 사용하는 것은 일반적으로 좋지 않은 습관입니다. 멀티스레드 환경에서 안전하지 않으며, 상태를 유지하게 되어 버그를 유발할 수 있습니다.
  2. 메서드 시작:

    • res = "";는 메서드가 호출될 때마다 결과 문자열을 초기화합니다. 이전 호출의 결과가 남지 않도록 합니다.
  3. 정수 변환:

    • Integer.toString(n)은 정수 n을 문자열로 변환합니다. 예를 들어, n118372라면 "118372"라는 문자열로 변환됩니다.
  4. 문자 스트림 생성:

    • .chars()는 문자열의 각 문자를 IntStream 형태로 변환합니다. 각 문자는 ASCII 값으로 표현됩니다.
  5. 정렬:

    • .sorted()는 문자 스트림을 오름차순으로 정렬합니다. 예를 들어, "118372"는 정렬 후 ["1", "1", "2", "3", "7", "8"]이 됩니다.
  6. 문자 추가:

    • .forEach(c -> res = Character.valueOf((char)c) + res);는 정렬된 각 문자에 대해 반복하며, res 문자열의 앞에 추가합니다. 즉, 가장 큰 숫자부터 차례로 res에 추가됩니다. 이로 인해 res는 내림차순으로 정렬된 문자열이 됩니다.
  7. 정수 변환 및 반환:

    • return Integer.parseInt(res);는 최종 문자열을 정수로 변환하여 반환합니다. 만약 res"873211"이라면, 이 메서드는 873211을 반환합니다.

요약

이 메서드는 주어진 정수의 각 자릿수를 내림차순으로 정렬하여 새로운 정수를 생성합니다. 그러나 전역 변수를 사용하고, 메모리와 성능 측면에서 비효율적인 부분이 있어, 개선이 필요합니다. 또한, int 타입으로 제한되어 있어 큰 숫자를 처리할 수 없다는 점도 유의해야 합니다.

0개의 댓글