숫자 문자열을 높은 순서로 재정렬하기

나의 기록·2026년 5월 31일

코딩테스트

목록 보기
6/35

📌 문제

long 타입의 숫자를 받아서 각 자릿수를 내림차순으로 정렬한 후 반환

예시

입력: 35214
출력: 54321

💡 풀이 흐름

long → String → Integer[] → 내림차순 정렬 → StringBuilder → long

🔄 리팩토링 전후 비교

Before

import java.util.Arrays;
class Solution {
    public long solution(long n) {
        long answer = 0;
        String sumNum = "";
        String strNum = String.valueOf(n);
        String[] strNumArr = strNum.split("");
        Integer[] arrNum = new Integer[strNumArr.length];

        for(int i = 0; i < strNumArr.length; i++){
            arrNum[i] = Integer.valueOf(strNumArr[i]);
        }

        Arrays.sort(arrNum, (o1, o2) -> o2 - o1);

        for(int factor : arrNum){
            sumNum += String.valueOf(factor);
        }

        return answer = Long.valueOf(sumNum);
    }
}

After

import java.util.Arrays;
class Solution {
    public long solution(long n) {
        String strNum = String.valueOf(n);
        Integer[] arrNum = new Integer[strNum.length()];
        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < strNum.length(); i++){
            arrNum[i] = strNum.charAt(i) - '0';
        }

        Arrays.sort(arrNum, (o1, o2) -> o2 - o1);

        for(int factor : arrNum){
            sb.append(factor);
        }

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

✏️ 변경 사항 요약

항목BeforeAfter이유
불필요한 변수answer, sumNum 선언제거사용하지 않는 변수 정리
변환 단계String → String[] → Integer[]String → Integer[]split("") 제거, charAt(i) - '0' 사용
문자열 합치기sumNum += String.valueOf(factor)StringBuilder.append()String 불변 객체 반복 생성 방지
반환return answer = Long.valueOf(sumNum)return Long.valueOf(sb.toString())불필요한 변수 할당 제거

🔑 핵심 포인트

1. charAt(i) - '0' 으로 변환 단계 축소

'0'(48) ~ '9'(57) ASCII 값이 순서대로 증가하기 때문에
char 타입 그대로 비교해도 숫자 크기 순서와 동일

// Before
arrNum[i] = Integer.valueOf(strNumArr[i]);

// After
arrNum[i] = strNum.charAt(i) - '0';

2. Comparator로 내림차순 정렬

int[]는 Comparator를 사용할 수 없으므로 Integer[] 사용

Arrays.sort(arrNum, (o1, o2) -> o2 - o1);
경우반환값결과
o1=3, o2=5양수o1이 뒤로 → 5, 3
o1=5, o2=3음수o1이 앞에 유지 → 5, 3

3. StringBuilder로 성능 개선

String은 불변(immutable)이라 += 반복 시 매번 새 객체 생성

// Before
sumNum += String.valueOf(factor);  // 매번 새 String 객체 생성

// After
sb.append(factor);  // 같은 객체에 이어붙이기

✅ 최종 코드

import java.util.Arrays;

class Solution {
    public long solution(long n) {
        String strNum = String.valueOf(n);
        Integer[] arrNum = new Integer[strNum.length()];
        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < strNum.length(); i++){
            arrNum[i] = strNum.charAt(i) - '0';
        }

        Arrays.sort(arrNum, (o1, o2) -> o2 - o1);

        for(int factor : arrNum){
            sb.append(factor);
        }

        return Long.valueOf(sb.toString());
    }
}
profile
뭐든 남겨본다

0개의 댓글