[프로그래머스,Level 2] 가장 큰 수(JAVA 구현)
코테/프로그래머스(Programmers)

[프로그래머스,Level 2] 가장 큰 수(JAVA 구현)

반응형

- 첫 풀이

  이 문제는 바로 직전에 풀었던 소수 찾기 문제와 같은 방식으로 풀어보고자 했고, 테스트 케이스 역시 통과할 수 있었다. 

  그러나 제출 후 채점을 한 결과는 처참했다.

  이후 문자열을 연결 처리하는 과정에서 매 번 새로운 객체를 생성해내는 String을 대신해 하나의 객체에 지속적인 갱신이 가능한 StringBuilder를 사용해 풀어보고자 했지만 잘 풀리지 않았다.

 

- 정답풀이

    결국 다른 분들의 풀이를 참고했더니 특정 기준으로 배열을 정렬하는 Comparator을 이용하는 것을 보고 이와 관련해서 생각하니 쉽게 풀 수 있었다. 예제 입력 1의 경우 6, 10, 2가 있을 때 두 개씩 생각해보면 6+10인 610과 10+6인 106을 비교하면 610이 더 크므로 자리를 바꿀 필요가 없다. 이러한 방식으로 정렬을 수행한 뒤, 모두 합쳐주면 정답이 된다.

 

  단, 여기서 주의해야 할 점은 모두 0으로 입력이 되는 경우 위와 같은 로직으로는 0000.... 과 같이 0이 지속될 수 있으므로 가장 첫 숫자가 0이라면, 그 뒤의 숫자도 0일 수밖에 없기 때문에 0을 반환하는 예외처리를 추가해주어야 한다.

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

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        // 1. 입력 데이터를 문자열 배열로 변환.
        String[] str = new String[numbers.length];
        
        for(int i = 0 ; i<str.length;i++){
            str[i] = String.valueOf(numbers[i]);
        }
        
        // 2. Comparator 인터페이스로 정렬 기준을 설정.
        Arrays.sort(str,new Comparator<String>(){
            // 예제 입력1에서 6과 10을 생각해보면 o2가 6, o1이 10이 된다. 이를 지속해서 반복.
            public int compare(String o1,String o2){
                return (o2+o1).compareTo(o1+o2);
            }
        });
        
        // 3. 모든 문자열을 연결한다.
        for(String arr : str)
            answer+=arr;
        
        // 4. 입력 데이터가 모두 0인 경우 예외 처리.
        if(str[0].equals("0")) answer = "0";
        
        return answer;
    }
}
반응형