생각정리/코딩테스트

[JAVA][Level1]PROGRAMMERS 정수 내림차순으로 배치하기

생각중임 2023. 8. 18. 14:28

정수 내림차순으로 배치하기


문제 설명

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

제한사항

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

입출력 예

n return
118372 873211

입출력 예 설명

없음


나의 문제풀이

class Solution {
    public long solution(long n) {
        // 우선순위 큐를 이용해서 큰자리수 자동정렬을 만든다.
        PriorityQueue queue = new PriorityQueue(Collections.reverseOrder());
        String answer = "";
        
        // 큐에 정수n의 값을 넣어주면 자동정렬이 된다.
        queue.addAll(List.of(String.valueOf(n).split("")));

        // 높은순으로 정렬된 큐를 문자열에 순차적으로 넣어준다.
        while (!queue.isEmpty()) {
            answer += (String) queue.poll();
        }
        
        // 문자열을 정수로 변환하여 값을 입력
        return Long.parseLong(answer);
    }
}
  • 자연수 n을 우선순위 큐를 이용해서 큰 자릿수 정렬을 해준다.
  • 큐안의 값이 없을 때까지 꺼내어 문자열에 나열해준다.
  • 제한 조건이 int형의 크기를 넘어가기 때문에 문자열을 long형으로 변환하여 출력한다.

다르게 풀어본 풀이

import java.util.*;

class Solution {
    public long solution(long n) {
        // 우선순위 큐를 이용해서 큰자리수 자동정렬을 만든다.
        PriorityQueue queue = new PriorityQueue(Collections.reverseOrder());
        
        // 큐에 정수n의 값을 넣어주면 자동정렬이 된다.
        queue.addAll(List.of(String.valueOf(n).split("")));

        // 높은순으로 정렬된 큐를 StringBuilder에 순차적으로 넣어준다.
        StringBuilder sb = new StringBuilder();
        while (!queue.isEmpty()) {
            sb.append(queue.poll());
        }
        
        // StringBuilder을 정수로 변환하여 값을 출력
        return Long.parseLong(sb.toString());
    }
}

import java.util.*;

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

        for (String str : list) answer += str;
        
        return Long.parseLong(answer);
    }
}

처음에는 최근에 우선순위 큐라는 최댓값 구하는 방법을 찾아봤어서 그걸 활용해 볼 수 있을 것 같아서 PriorityQueue를 이용해서 큐에 값을 자동적으로 정렬시키는 방법을 사용해서 해보았는데 그냥 배열을 사용했을 때는 어떨지 궁금해 비교를 해보았다.
새로 하나하나의 값을 받는 게 아니라서 그런지 우선순위 큐 보다 배열을 사용하였을 때가 살짝 빠른 결과가 나왔다.
큐와 배열을 사용했을 때보다 그냥 문자열을 사용했을 때와 StringBuilder를 사용할 때가 속도면에서 훨씬 빨라지는 차이가 났다. 또한, Arrays.sort에서 리버스 해주는 것보다 sb에서 역순으로 출력하는 게 더 빨랐다.
동일한 기능을 할 수 있는 방법들이 여러 가지이지만 상황에 따라 최적화된 방법들을 잘 이용할 수 있도록 여러 방법들로 코드를 익혀봐야겠다.

 

 

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