[오늘의 문제] 정수 내림차순으로 배치하기

shlim55·2025년 6월 30일

코딩테스트

목록 보기
92/223

출처: https://school.programmers.co.kr/learn/courses/30/lessons/12933

문제 설명
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건
n은 1이상 8000000000 이하인 자연수입니다.
입출력 예
n return
118372 873211

내가 작성한 코드문

import java.util.*;
class Solution {
    public long solution(long n) {
        long answer = 0;
        
        // n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴
        String str = n + "";// 문자열 타입으로 변환
        
        String []arr = str.split("");// 배열에 각 원소 저장
        // int []intArr = new int[arr.length];
        
        // 각 원소를 돌면서 문자열-> 정수 변환후 새로운 int 배열에 저장
        // for(int i = 0; i < arr.length; i++){
        //     intArr[i] = Integer.parseInt(arr[i]);
        // }

        // 이것도 내림차순 라이브러리 활용
        Arrays.sort(arr,Comparator.reverseOrder());
        
        // 버블 정렬로 내림 차순 정렬
        // for(int i = 0; i < intArr.length - 1; i++){
        //     for(int j = 0; j < intArr.length - 1 - i; j++){
        //         if(intArr[j + 1] > intArr[j]) {
        //             int tmp=intArr[j];
        //             intArr[j]=intArr[j + 1];
        //             intArr[j + 1]=tmp;
        //         }    
        //     }
        // }
        // int 배열원소를 다시 string 타입으로 변환후 정수화 
        
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < arr.length; i++){// 성능 최적화 스트링 빌더 사용해보기
            sb.append(arr[i]);
        }
//         String str2 = sb.toString();
//         answer = Integer.parseInt(str2);// 다시 정수화

        return Long.parseLong(sb.toString());
    }
}

맨 처음에 내 생각은 이랬다.
1. 배열에 각 원소를 스트링 타입으로 저장
2. 스트링 배열 크기와 같은 정수 변언 선언
3. 각 원소 돌면서 정수로 형변환 후 정수 배열에 저장
4. 버블 정렬로 내림차순 정렬 시키기
5. int 배열원소를 다시 string 타입으로 변환후 정수화
6. 반복문 돌면서 다시 스트링 타입 변수에 저장 시키기
7. 스트링 타입에 저장된 변수 다시 정수화 후 리턴

이렇게 되면 너무 절차가 많고 시간 초과가 뜬다.
1. 배열에 각 원소를 스트링 타입으로 저장
2. 배열에 각 원소 저장
3. 라이브러리 써서 내림차순 정렬
4. 스트링 빌더 써서 각 원소 저장
5. 롱타입 형변환해서 리턴

위의 2,3번 과정을 2번에 4번 과정을 3번에 단축 시킴
위의 5,6번 과정을 4번에 단축시킴

항상 스트링 빌더 쓸수 있는지 파악하고, 어떡하면 더 코드 적게 쓸지 고민하기

다른 사람의 풀이

public class ReverseInt {
    String res = "";
    public int reverseInt(int n){
        res = "";
        Integer.toString(n).chars().sorted().forEach(c -> res = Character.valueOf((char)c) + res);
        return Integer.parseInt(res);
    }

    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void  main(String[] args){
        ReverseInt ri = new ReverseInt();
        System.out.println(ri.reverseInt(118372));
    }
}
import java.util.*;

class Solution {
  public long solution(long n) {
        String[] list = String.valueOf(n).split("");
        Arrays.sort(list);

        StringBuilder sb = new StringBuilder();
        for (String aList : list) sb.append(aList);

        return Long.parseLong(sb.reverse().toString());
  }
}
profile
A Normal Programmer

0개의 댓글