코딩테스트/Java

[JAVA] 정렬 "가장 큰 수"

SK_MOUSE 2020. 9. 18. 16:16
반응형

 

너무 복잡하게 생각하여 문제풀이를 실패했다.

 

단순하게 Sort에서 Compare 메소드를 오버라이드할때,

String o1, o2를 비교하면, o1+o2 와 o2+o1을 Integer로 변환해서

비교하여 정렬하는 방식으로 해야한다.

 

가장 이해하기 쉬운 코드리뷰이다.

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String solution(int[] numbers) {
        String[] nums = new String[numbers.length];

        for (int i=0; i<nums.length; i++) 
            nums[i] = numbers[i] + "";

        Arrays.sort(nums, new Comparator<String>() {
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });

        String ans = "";
        for (int i=0; i<numbers.length; i++)
            ans += nums[i];

        return ans.charAt(0) == '0' ? "0" : ans;
    }
}

 

위처럼 Compare메소드를 오버라이드해서 단순히 문자열을 더한걸 parseInt하여 비교하는 것이다.

 

다만  이 경우, 수행시간이 매우 커지는 현상이 발생하였다.

그에 따른 이유는 반복해서 String을 더하는 경우, new String을 하여 힙이 계속 쌓이게 된다고 한다.

 

이렇게 String을 계속해서 더하는 경우는 StringBuilder를 이용하라고 한다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";

        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < numbers.length; i++) {
            list.add(numbers[i]);
        }
        Collections.sort(list, (a, b) -> {
            String as = String.valueOf(a), bs = String.valueOf(b);
            return -Integer.compare(Integer.parseInt(as + bs), Integer.parseInt(bs + as));
        });
        StringBuilder sb = new StringBuilder();
        for(Integer i : list) {
            sb.append(i);
        }
        answer = sb.toString();
        if(answer.charAt(0) == '0') {
            return "0";
        }else {
            return answer;
        }
    }
}

위의 코드를 살펴보면, Collections.sort를 이용하여 비교한다(return 마이너스인것은 내림차순으로 정렬하기위한것)

 

StringBuilder sb = new StringBuilder(); 으로 선언해준다.

 

sb.append(값); 을해서 String에 값을 더해준다.

 

answer = sb.toString(); 을 통해서 StringBuilder->String으로 변환해준다.

 

이러한 경우 String값을 많이 사용하는 케이스어서 첫번째 코드보다 두번째 코드에서 9배가량의 속도차이가 났다.

StringBuilder를 이용하면 이렇게 메모리의 힙을 절약할 수 있다.

반응형

'코딩테스트 > Java' 카테고리의 다른 글

[JAVA] 완전탐색 "소수 찾기"  (0) 2020.09.23
[JAVA] 완전탐색 "모의고사"  (0) 2020.09.21
[JAVA] 힙 "이중우선순위큐"  (0) 2020.09.15
[JAVA] 힙 "디스크 컨트롤러"  (0) 2020.09.15
[JAVA] 힙 "더 맵게"  (0) 2020.09.10