프로그래머스/Lv. 1

[프로그래머스 코딩테스트] 정수 내림차순으로 배치하기(Java)

Sigfriede 2023. 4. 6. 00:47

  문제 설명

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

 

  제한사항

  • n은 1이상 8000000000 이하인 자연수입니다.

 

  입출력 예

n return
118372 873211
import java.util.ArrayList;
import java.util.Collections;
class Solution {
    public long solution(long n) {
        long answer = 0;
        ArrayList<Integer> arr = new ArrayList<>();
        while (n > 0) {
            arr.add((int)(n % 10));
            n /= 10;
        }
        Collections.sort(arr, Collections.reverseOrder());
        
        for (int i = 0; i < arr.size(); i++) {
            answer += arr.get(i) * Math.pow(10, arr.size() - i - 1);
        }
        return answer;
    }
}

  ArrayList를 생성해줍니다. whlie문의 나머지 연산으로 자릿수를 구해 arr에 추가합니다. ArrayList의 Generic을 Integer로 설정해서 추가할 때 int형으로 다시 캐스팅을 해주었는데요, 그렇게 하지 않고 처음부터 Generic에 Long형을 쓰면 됩니다. 저는 너무 늦게 알았지만요.

  ArrayList는 Collections 클래스를 사용합니다. 내림차순 정렬이 필요하므로 reverseOrder() 메소드를 추가로 사용했습니다.

  이후 for문은 arr의 크기만큼 순회합니다. arr에서 순서대로 숫자를 가져와서 Math.pow(10, arr.size() - i - 1)만큼 곱해줍니다. while문에서 숫자를 자릿수대로 쪼개었듯이 이번에는 숫자를 자릿수별로 붙여주는 과정입니다. 입출력 예를 예시로 들어보자면, 800000 + 70000 + 3000 + 200 + 10 + 1로 만들어주는 것입니다.

  이 풀이도 꽤 복잡한 것 같아서, StringBuilder를 통한 문자열 형식으로 풀어주는 것이 더 효율적이지 않을까 싶은 생각이 듭니다.