PRACTICE/JAVA

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

j1ngerhead 2024. 10. 1. 23:30

 

문제 링크

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

import java.util.*;

class Solution {
    public long solution(long n) {

         // 1. 정수를 문자열로 변환
        String str = Long.toString(n);
        
        // 2. 문자열을 문자 배열로 변환
        Character[] charArray = new Character[str.length()];
        for (int i = 0; i < str.length(); i++) {
            charArray[i] = str.charAt(i);
        }
        // 3. 문자 배열 정렬 (내림차순)
        Arrays.sort(charArray, Collections.reverseOrder());

        // 4. 정렬된 문자 배열을 다시 문자열로 변환
        StringBuilder sortedStr = new StringBuilder();
        for (char c : charArray) {
            sortedStr.append(c);
        }

        // 5. 문자열을 정수로 변환하여 반환
        return Long.parseLong(sortedStr.toString());
    }
}

 

정수를 문자열로 변환한 후(각 자릿수 분리를  위해) 문자열을 문자 배열로 변환하고 이를 정렬해서

정렬된 문자 배열 → 다시 문자열로 변환 → 정수로 변환한다. 

 


Character 대신 char 쓰면 에러났던 이유에 대해 gpt에게 물어보았다.

 

Character와 char는 자바에서 다루는 서로 다른 데이터 타입임 !

 

1. 기본형과 참조형

  • char: 기본형(primitive type)입니다. 각 문자를 단순한 형태로 저장
  • Character: 참조형(wrapper class)입니다. char를 객체로 감싸는 형태로, 추가적인 기능을 제공

2. 배열의 타입

  • Character[] charArray: Character 타입의 배열
    이 배열은 각 문자를 Character 객체로 저장할 수 있다.
    자바에서 배열의 크기를 정적으로 지정할 때 객체 배열을 사용할 수 있다.
  • char[]: 기본형 char 타입의 배열, 각 문자를 단순히 저장한다.

문제의 원인

Arrays.sort() 메서드는 일반적으로 객체 배열에 대해 작업을 수행할 수 있지만,
char[]는 기본형 배열이기 때문에 직접적으로 Collections.reverseOrder()와 함께 사용할 수 없다. Collections.reverseOrder()는 객체를 정렬하기 위한 메서드이기 때문에 기본형 배열을 정렬할 수 없음 !

따라서, char[]를 사용하려고 할 경우에는 Arrays.sort() 메서드를 직접 사용할 수 있지만,
내림차순 정렬을 위해 char[]를 Character[]로 변환하고 Collections.reverseOrder()를 사용해야 한다.

 

char[]를 사용하고 내림차순 정렬을 구현한 풀이

import java.util.Arrays;

class Solution {
    public long solution(long n) {
        // 1. 정수를 문자열로 변환
        String str = Long.toString(n);
        
        // 2. 문자열을 char 배열로 변환
        char[] charArray = str.toCharArray();

        // 3. char 배열 정렬 (오름차순)
        Arrays.sort(charArray);

        // 4. 정렬된 배열을 뒤집기 (내림차순)
        StringBuilder sortedStr = new StringBuilder(new String(charArray)).reverse();

        // 5. 문자열을 정수로 변환하여 반환
        return Long.parseLong(sortedStr.toString());
    }
}

 

320x100