[Algorithm] 백준(BOJ) - 1427. 소트인사이드 (JAVA)

소트인사이드

배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

입력

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.

Example

#1

입력
2143

출력
4321

#2

입력
999998999

출력
999999998

#3

입력
61423

출력
64321

#4

입력
500613009

출력
965310000

내가 작성한 코드

우선 지난 번에 Arrays.sort() 메소드를 이용하여 풀면 시간초과가, Collection.sort() 메소드를 이용하여 풀면 통과되었던 기억이 있어서 Collection.sort() 메소드를 이용하여 풀었다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String[] arr = br.readLine().split("");
        
        List<Integer> list = new ArrayList<>();
        for (String str : arr) {
            list.add(Integer.parseInt(str));
        }
        
        Collections.sort(list);
        Collections.reverse(list);
        
        for (int a : list) {
            sb.append(a);
        }
        
        System.out.println(Integer.parseInt(sb.toString()));
    }
}

다른 분들은 어떻게 풀었나 알아보니, 아래와 같은 풀이 방법들이 있었다.

  • 카운팅 정렬을 이용한 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] counting = new int[10];
        String str = br.readLine();
        
        for (int i = 0; i < str.length(); i++) {
            counting[str.charAt(i) - '0']++;
        }
        
        for (int i = 9; i >= 0; i--) {
            while (counting[i]-- > 0) {
                System.out.print(i);
            }
        }
    }
}
  • Arrays.sort() 메소드를 이용한 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] arr = br.readLine().toCharArray();
        Arrays.sort(arr);
        for (int i = arr.length-1; i >= 0; i--) {
            System.out.print(arr[i]);
        }
    }
}

위 세 가지 풀이 방법의 성능은 어떻게 될까?

BOJ 1427 performance test

위부터 순서대로,

  • 36445140 : Arrays.sort() 메소드를 이용한 풀이
  • 36445068 : 카운팅 정렬을 이용한 풀이
  • 36444848 : Collections.sort() 메소드를 이용한 풀이 (내 풀이)

로 속도는 내가 작성한 풀이가 근소하게 빠르지만, 메모리가 차지하는 양은 제일 큰 것을 확인할 수 있다.

시간 복잡도 뿐만 아니라, 공간 복잡도까지 생각해서 풀이할 수 있도록 다른 방식들을 많이 찾아보고 고심하여 풀어보면 좋을 것 같다.

더 많은 알고리즘 문제 풀이는 여기서 확인할 수 있다.

댓글남기기