[프로그래머스/JAVA]정수 내림차순으로 배치하기

kongta2·2023년 11월 14일

문제 설명

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

제한 조건

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

입출력 예

nreturn
118372873211

풀이

[1]

class Solution {
    public long solution(long n) {
        long answer = 0;
        String s = n + "";
        int[] n_list = new int[s.length()];
        for(int i = 0; i < s.length(); i++) {
            n_list[i] = (int)(n % 10);
            n /= 10;
        }

        for(int i = 0; i < s.length(); i++) {
            for(int j = i + 1; j < s.length(); j++) {
                if(n_list[i] < n_list[j]) {
                    int tmp = n_list[i];
                    n_list[i] = n_list[j];
                    n_list[j] = tmp;
                }
            }
        }
        
        answer = Long.parseLong(Arrays.toString(n_list));
        
        return answer;  
    }
}

입력받은 n을 문자열로 바꾼 뒤 리스트를 만들고 정렬을 한 뒤, 리스트를 다시 스트링배열로 바꾼 뒤 Long형태로 바꾸는 식으로 문제를 풀었다.
하지만 이렇게하면 다음과 같은 오류가 발생한다.

이 오류는 숫자가 아닌 값을 변환할 때 발생하는 오류이다.
Arrays.toString(n_list)를 하면서 string이 [8, 7, 3, 2, 1, 1]이런식으로 저장이 되었기 때문에 parseLong을 하는 과정에서 숫자가 아닌값이 포함이 되어있어서 발생했다.

이 문제의 해결 방법은 숫자 이외의 문자들( [, ], ',')을 제거하기 위해서 replaceAll을 사용한다.

	String str = Arrays.toString(n_list).replaceAll("[^0-9]","");
    answer = Long.parseLong(str);

[^0-9]의 뜻은 숫자 빼고 모든 문자를 뜻한다.
replaceAll을 사용하면 오류없이 컴파일이 된다.

[2]

class Solution {
    public long solution(long n) {
    long answer = 0;
    String[] s = Long.toString(n).split("");
        
        Arrays.sort(s, Collections.reverseOrder());

        answer = Long.parseLong(String.join("", s));

        return answer;
    }
}

Long.toString().split()을 이용하여 훨씬 편하게 String 배열로 변환한 뒤
sort함수를 이용하는데 기본적으로 오름차순이기때문에 Collections.reverseOder()을 이용하여 내림차순으로 바꿔준다.
그리고 String.join을 이용하여 String 배열을 문자열로 바꿔준 뒤 parseLong을 이용하여 long형태로 변환한다.

split과 join을 잘 사용하니 이렇게 간편해진다.. 많이 배워야겠다.

profile
2025.04.01~

0개의 댓글